1. 程式人生 > >Web UI 優化自動化測試用例的穩定性

Web UI 優化自動化測試用例的穩定性

     Web UI自動化測試的一個很重要的問題就是整個測試的穩定性,經常在執行測試的時候出現這樣或那樣的問題,而且大多都是穩定性問題,而非BUG,最近我針對同事的用例的穩定性問題做了些優化策略,今天跑了 500個用例 沒有一個出現穩定性問題,當然 可能有運氣成分吧 呵呵 總共執行時間 5小時,實際的測試用例有70-80個左右 是迴圈跑出了500次 特此宣告一下 不然有人會質疑,UI自動化 以迴歸 和冒煙為主  我這不會出現那麼多用例的,投入產出 會隨著用例數增長而下降的,我們的自動化其實還是介面為重點。

killed the useless process
Tests run: 501, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18,205.275 sec - in TestSuite

Results :

Tests run: 501, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:03 h
[INFO] Finished at: 2015-12-08T18:41:54+08:00
[INFO] Final Memory: 19M/222M
[INFO] ------------------------------------------------------------------------
Recording test results
Sending e-mails to: 
[email protected]
Finished: SUCCESS

新增頁面跳轉判斷頁面載入過程的程式碼:
package ec.qa.autotest.ui.common.action;


import java.util.concurrent.TimeUnit;


import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.SystemClock;
import org.testng.Assert;


import ec.qa.autotest.ui.custom.annotation.PageObject;
import ec.qa.autotest.ui.testbase.TestBase;


@PageObject
public class SupplierProgressCommonAction {


	@FindBy(how = How.ID, using = "ngProgress")
	private WebElement spProgress;
	
	private final long TIMEOUTS = 5000;
	
	private final long WAIT_TIME = 500;


	public SupplierProgressCommonAction() {
		PageFactory.initElements(TestBase.getWebDriver(), this);
	}


	public void waitForProgressTOComplete(long timeOut) throws InterruptedException {
		Assert.assertEquals(isProgressCompleted(timeOut), true);
	}


	public void waitForProgressTOComplete() throws InterruptedException {
		Assert.assertEquals(isProgressCompleted(TIMEOUTS), true);
	}


	private boolean isProgressCompleted(long timeOut) throws InterruptedException {
		SystemClock sc =new SystemClock();
		long endTime = sc.laterBy(timeOut);
		
		while (sc.isNowBefore(endTime)) {
			TimeUnit.MILLISECONDS.sleep(WAIT_TIME);
			if (spProgress.getAttribute("style").contains("width: 0%")) {
				WaitForUtil.pageIsPasered();
				return true;
			}
		}
		return false;
	}
}


一些通用的保證測試穩定的程式碼:

package ec.qa.autotest.ui.common.action;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.SystemClock;
import org.openqa.selenium.support.ui.WebDriverWait;

import ec.qa.autotest.ui.testbase.TestBase;

/**
 * @author xin.wang 等待頁面解析完成
 */
public class WaitForUtil {

	private static final long TIMEOUTS = 4000;

	private static final long WAIT_TIME = 300;

	public static void pageIsPasered() {
		new WebDriverWait(TestBase.getWebDriver(), 10).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver driver) {
				return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
			}
		});
	}

	public static String getPageFieldText(WebElement el) throws InterruptedException {
		long startTime = System.currentTimeMillis();
		long curTime = startTime;
		while ((curTime - startTime) <= TIMEOUTS) {
			TimeUnit.MILLISECONDS.sleep(WAIT_TIME);
			if (el.getText().trim() != "" && el.getText() != null) {
				return el.getText();
			}
			curTime = System.currentTimeMillis();
		}
		return "";
	}

	/**
	 * @author xin.wang 
<span style="white-space:pre">	</span> *等待元素是否可見
	 */
	public static WebElement waitForElementToDisplay(WebElement el) throws Exception {
		SystemClock sc = new SystemClock();
		long endTime = sc.laterBy(TIMEOUTS);
		boolean flag = false;

		while (sc.isNowBefore(endTime)) {
			TimeUnit.MILLISECONDS.sleep(WAIT_TIME);
			if (el.isDisplayed()) {
				flag = true;
				break;
			}
		}
		if (!flag) {
			throw new Exception("the element is not visable");
		}
		return el;
	}
}


相關推薦

Web UI 優化自動化測試穩定性

     Web UI自動化測試的一個很重要的問題就是整個測試的穩定性,經常在執行測試的時候出現這樣或那樣的問題,而且大多都是穩定性問題,而非BUG,最近我針對同事的用例的穩定性問題做了些優化策略,

一個簡單的web自動化測試(webdriver 與 unittest 結合)

#coding=utf-8 from selenium import webdriver import unittest import time import sys reload(sys) sys.setdefaultencoding('utf8') class My

自動化測試設計的原則

自動化 多少 target 刪除 問題 正是 測試工具 例子 解決方案 自動化測試用例設計的原則 很多公司在實施自動化測試的過程中,往往會把所有的手工測試用例作為自動化測試用例,並且直接進行腳本的開發工作,甚至有些公司不寫自動化測試用例,直接想當然地開發測試腳本,這些都是

自動化測試設計三原則

命令 進行 test 服務 更換 打印 抽取 自動 持續集成 今天總結一下在做自動化測試中測試用例設計的一些建議,總結為三原則: 1. 保持Case之間的獨立性 case獨立性就是能夠獨立運行,當我們有隨機的跑其中某個Case或亂序的跑這些Cases時,測試的結果都應該是準

web功能模塊測試(模板)

blank png tps baidu web .com 用例 測試 技術 web功能模塊測試用例(模板): https://wenku.baidu.com/view/4ada3464ddccda38376baff8.html 如圖所示: web功能模

自動化測試編寫的規範

上下 可能 重復 功能點 正向 font 場景 關閉瀏覽器 進行 1.一個腳本是一個完整的場景,從用戶登陸操作到用戶退出系統關閉瀏覽器。 2.一個腳本腳本只驗證一個功能點,不要試圖用戶登陸系統後把所有的功能都進行驗證再退出系統 3.盡量只做功能中正向邏輯的驗證,不要考慮太

自動化測試設計思想指南

不少新手剛剛掌握了寫指令碼的能力,一上來就拿著功能測試用例一條一條的轉化成自動化用例。在編寫的過程中,會發現諸多問題,例如,指令碼中重複程式碼很多,一個指令碼的執行結果影響到另一個指令碼的執行,有些功能用例很難轉化成自動化用例等。 下面談談幾條指導建議:站在使用者角度設計自動化 在功能測試的時

自動化測試設計

 一、瞭解自動化測試的目的和作用   自動化測試是為了讓測試人員從繁瑣重複的機械式測試過程中解脫出來,把時間和精力投入到更有價值的地方,從而挖掘更多的產品缺陷。目前自動化測試更多的是定位在冒煙測試和迴歸測試;冒煙測試執行的是主體功能點的用例。迴歸測試執行全部或部分的測試用例。它的主要目的在於驗證

Appium+java+Android二(uiautomatorviewer定位手機頁面元素+Java編寫自動化測試)

uiautomatorviewer定位手機頁面元素+編寫自動化測試用例 如何安裝及搭建appium的環境請參考我的上篇部落格appium+java+Android環境搭建 uiautomatorviewer工具是用來給手機頁面元素定位的,所以在使用uiautomatorviewer之前,

自動化測試編寫守則

  先來說下一般自動化測試的流程,今天一個朋友也問過我這個問題,就順便說說。   一般在開始自動化測試,如拿到一個程式包或apk或網站檔案後,我們首先要做的就是要分析這個程式適不適合進行自動化測試;之後再對程式的執行路徑進行分析,找出一些關鍵路徑和有針對性的進行測試設計

python 和 selenium實現web UI功能自動化測試框架(米兔888)

之前分享了python和requests搭配實現的介面自動化測試框架,今天,我再來整理分析下基於python和selenium的web UI自動化測試,希望能對大家有所幫助,也是自己整理知識學習的方法,跟大家一起努力,奮鬥在自動化測試的道路上。其實UI自動化和介面自動化框架的

一個登入的自動化測試(新手)

一個登入的測試用例怎麼寫呢?小夥伴們都是:1、在使用者欄輸入xxxx,2、在密碼欄輸入xxxx,3、點選登入按鈕,登入成功。很多小夥伴都是這樣,其實不對。相對標準的用例應該是這樣: 1、開啟Firefox()瀏覽器 2、在開啟的Firefox()瀏覽器位址列輸入"http:

Teuthology的使用與Ceph自動化測試的編寫(一)

這裡將簡單介紹teuthology中自動化測試的用例的編寫。Ceph的自動化測試使用yaml檔案描述,如下的例子搭建了一個三節點的Ceph叢集,終端在叢集搭建好後停止在python的interactive上,允許測試著呼叫相關的函式與叢集互動。 rol

根據接口文檔中的入參,生成自動化測試的異常測試用

alt cas system com ext brush pri tle char @Test public void TestapiVar() { List<ApiCaseBean> list = apiCaseService.

關於自動化測試失敗重試的一些思考

自動化測試用例失敗重跑有助於提高自動化用例的穩定性,那我們來看一下,python和java生態裡都有哪些具體做法? # 怎麼做 如果是在python生態裡,用pytest做測試驅動,那麼可以通過pytest的外掛pytest-rerunfailures來實現失敗用例重跑,具體的使用方式有兩種,一種是通過命令

Web自動化框架LazyUI使用手冊(2)--先跑起來再說(第一個測試-百度搜索)

作者:cryanimal QQ:164166060 上篇文章中,簡要介紹了LazyUI框架,本文便來演示,如何從無到有快速搭建基於lazyUI的工程,併成功執行第一個測試用例。 本文以百度搜索為例,選用chrome瀏覽器進行演示(安裝在預設路徑),IDE選用

GUI自動化測試優化測試思維方法

維度 ui自動化 測試執行 模型 數據 不同 指導 業務 函數 1、測試腳本與數據解耦(數據驅動) 讓操作相同但是數據不同的測試可以通過同一 套自動化測試腳本來實現,只是在每次測試執行時提供不同的測試輸入數據。 2、頁面對象模型(POM) 以頁面為單位來封裝頁面上的控

使用jmeter+ant進行接口自動化測試(數據驅動)之二:利用apache-ant執行測試並生成HTML格式測試報告

extras true -c 註釋符 www 文件的 介紹 ntc encoding 在 使用jmeter+ant進行接口自動化測試(數據驅動)之一 介紹了如何使用csv文件來批量管理接口 本次接著介紹如何利用apache-ant執行測試用例並生成HTML格式測試報告 ①下

web網頁測試(非常實用)

Web測試中,各類web控制元件測試點總結 一 、介面檢查   進入一個頁面測試,首先是檢查title,頁面排版,欄位等,而不是馬上進入文字框校驗   1、頁面名稱title是否正確   2、當前位置是否可見  您的位置:xxx>xxxx   3、文字

利用unittest框架編寫web測試(demo)

spec arm repr follow aid content ext lin get 1、前言: 對於初學者來說,python自帶的IDLE,精簡又方便,不過一個好的編輯器能讓python編碼變得更方便,更加優美些。 不過呢,也可以自己去下載其他更好用的代碼編輯器,