Skip to content

测试框架设计学习笔记

Part One

开始学习Udemy上的一个课程Design Selenium Test framework from scratch-Architect level,随手写一些笔记。

课程第一部分主要在讲testNG,在项目上目前一直接触的是JUnit,用起来还比较方便,小结一下,用到了JUnit里以下特性:

  • Category,进行test case分类,方便同一份代码在不同环境下选择执行不同的test case
  • Rule,解决test case执行失败时,进行截图并上传至Jenkins
  • Runner,解决执行中动态决定是否skip特定的test case

目前在课程中学习到testNG的以下特点:

  • testNG本身是测试框架,功能比较丰富
  • testNG在Eclipse上有插件支持,使用方便
  • testNG可以使用testing.xml来控制测试执行控制,从上到下分了Suit -> test -> classes -> methods这样几个分层
  • methods标签下可以使用include、exclude标签来包含或排除某些 method,也即test case
  • method,也即test case命名的时候要遵循一个统一的规则,比如FunctionOneLogin(), FunctionTwoOpen()等,方便后续在选择执行的时候,用正则表达式筛选test case,例如name=”Fun.*”表示相应的class里所有以”Fun”开头的test case

Part Two

学习到第12节课程,了解到testNG的anotation有以下(and more):

  • @BeforeSuitesuite是testNG使用的xml文件中的一个概念,也许可以理解为最上层的一个测试用例套件,一个suite可以包含有多个test
  • @BeforeTesttest这里可以理解成一个测试模块(test module),一个test可包含多个测试类class
  • @BeforeClassclass是指测试类,BeforeClass用来标记在一整个class测试类里的所有测试方法执行之前优先执行
  • @BeforeMethodmethod,就是一个测试用例,或者说是一个test类中的单个测试方法
  • @Test用来注释某个测试类里的方法是一个测试方法,也即测试用例
  • @AfterMethod
  • @AfterClass
  • @AfterTest
  • @AfterSuite
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suitename="Test suite - 1">
<testthread-count="5"name="My Test module 1">
<classes>
<classname="com.main.MainTest01"/>
<classname="com.test.NGTest01"/>
</classes>
</test>
<testname="My Test module - 2">
<classes>
<classname="com.test.NGTest02"/>
</classes>
</test>
</suite>

```text

补充一下,testNG中的xml还可以使用package标签,含义不言自明。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suitename="My Test Suite">
<testthread-count="5"name="My Test module">
<packages>
<packagename="com.main"></package>
</packages>
</test>
</suite>

```bash

# Part Three

学习到18节,完成了testNG的部分,其中包括了以下testNG的特性:

- group,例如加上tag@Test(groups={“smoke”}),就表示这个test属于smoke group,可以属于多个group,然后相应的在xml文件中,做如下定义,即可使用group,这里可以include也可以exclude。

```xml
<suitename="Test - 1">
<testname="My Test modul">
<groups>
<run>
<includename="smoke"/>
</run>
</groups>
<classes>
<classname="com.main.MainTest01"/>
<classname="com.test.NGTest01"/>
</classes>
</test>
</suite>

```text

- 定义test之间的依赖执行,例如加上tag@Test(dependsOnMethods={“Main03”}),即表示这个test依赖于另一个test Main03,将在其之后执行。
- 参数化,例如以下tag的定义,和xml里的定义,这样即可让Main03 test使用xml里定义的变量值。

```text
// 属于 com.main package里的 MainTest class
@Parameters({"URL1","URL2"})
@Test
publicvoidMain03(String url1, String url2){
System.out.println("main 03");
System.out.println(url1);
System.out.println(url2);
}
xml
<suitename="My Tet Suite">
<parametername="URL1"value="www.google.com"/>
<parametername="URL2"value="www.facebook.com"/>

<testname="My Test modul">
<packages>
<packagename="com.main"/>
</packages>
</test>
</suite>

```text

- @DataProvider特性,具体还是见代码

```text
@DataProvider
publicString[][] getData() {
String[][] data =newString[2][2];
data[0][0] ="1st-username";
data[0][1] ="1st-password";

data[1][0] ="2nd-username";
data[1][1] ="2nd-password";

returndata;
}

//这个test会被执行2次,以便使用getData()里提供的,所有的2组测试数据
@Test(dataProvider="getData")
publicvoidMain05(String username, String password){
System.out.println(username);
System.out.println(password);
}

```text

- Listeners特性,有点像JUnit里的TestWatcher,典型用法就是失败后截图,具体见代码..

```java
packagecom.main;

importorg.testng.ITestContext;
importorg.testng.ITestListener;
importorg.testng.ITestResult;

publicclassListenersimplementsITestListener{

@Override
publicvoidonTestStart(ITestResult result){
// do something when a test just start

}

@Override
publicvoidonTestSuccess(ITestResult result){
// do something when a test success
}

@Override
publicvoidonTestFailure(ITestResult result){
// do something when a test fail
}

@Override
publicvoidonTestSkipped(ITestResult result){
// do something when a test is skipped
}

@Override
publicvoidonTestFailedButWithinSuccessPercentage(ITestResult result){
// TODO Auto-generated method stub
}

@Override
publicvoidonStart(ITestContext context){
// TODO Auto-generated method stub
}

@Override
publicvoidonFinish(ITestContext context){
// TODO Auto-generated method stub
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suitename="My Tet Suite">
<listeners>
<listenerclass-name="com.main.Listeners"/>
</listeners>

<parametername="URL1"value="www.google.com"/>
<parametername="URL2"value="www.facebook.com"/>

<testthread-count="5"name="My Test modul">
<packages>
<packagename="com.main"></package>
</packages>
</test>
</suite>

最后更新于:

👁️ 阅读量:

基于 VitePress 构建