平时开发测试的时候都是手动测试,但是对于一些重复的基础测试,比如输入格式是否正确,选项是否可选,显示的文字提示是否正确,都可以用Selenium自动化测试代替,鉴于平常是使用Excel来管理测试用例数据的,所以这次想把Selenium和Excel结合起来,构建一个JUnit UI测试框架。
不过JUnit本身并不支持多线程,而在浏览器的操作本身是需要耗时不少,加上测试用例数据成百上千,如果只使用一个线程的话效率是很低的,而且,不像业务接口测试,这种UI自动化测试中有可能会因为各种各样的误差而导致测试不通过,遇到这种误差的时候就需要重试,但JUnit本身也不支持重试,综上所述,我们需要使用@RunWith对JUnit进行扩展。
扩展后的测试流程如下:
- 读取Excel中所有的测试用例数据
- 取出一条测试用例数据
- 启动浏览器
- 执行具体的测试逻辑
- 若测试不通过,并且未达到重试次数,则回到第4步,若已达到重试次数, 则截图
- 关闭浏览器,若仍有未取出的测试用例数据,则回到第2步
- 输出测试结果到Excel中
扩展后的JUnit已经包含了1,2,3,5,6,7这六个步骤,开发人员只需要实现第4步的具体的测试逻辑即可。
框架实现代码在https://github.com/hpq86zllw/junit-ui-test-framework
使用默认配置时的例子如下
@RunWith(UITestRunner.class)
public class SearchTest1 {
@Test
@InputAndOutput(inputArgs = { "/Test_Case.xls" }, outputArgs = { "/Test_Case_Result.xls" })
public void testSearch(Map<String, Object> testCaseData) {
WebDriver driver = Browser.getDriver();
Index index = PageFactory.initElements(driver, Index.class);
index.get();
index.search(testCaseData);
Result result = PageFactory.initElements(driver, Result.class);
result.check(testCaseData);
}
}
Test_Case.xls为测试用例数据,Test_Case_Result.xls为测试结果
启用多线程和重试功能时的例子如下
@RunWith(UITestRunner.class)
public class SearchTest2 {
@Test
@InputAndOutput(inputArgs = { "/Test_Case.xls" }, outputArgs = { "/Test_Case_Result.xls" })
@RuntimeSetting(threadNum = 2, retryNum = 1)
public void testSearch(Map<String, Object> testCaseData) {
WebDriver driver = Browser.getDriver();
Index index = PageFactory.initElements(driver, Index.class);
index.get();
index.search(testCaseData);
Result result = PageFactory.initElements(driver, Result.class);
result.check(testCaseData);
}
}
threadNum为线程数,retryNum为重试次数
其他例子可以查看README.md,编写完测试逻辑后按照平时启动JUnit的方法即可。