TA的每日心情 | 郁闷 2022-8-29 14:43 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]测试小兵
|
2#
楼主 |
发表于 2018-2-23 14:44:11
|
只看该作者
测试用例的管理
- 1. testng.xml文件结构
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd">
- <suite name="suitename" junit="false"verbose="3" parallel="false" thread-count="5"
- configfailurepolicy="skip"annotations="javadoc"
- time-out="10000"skipfailedinvocationcounts="true" data-provider-thread-count="5"
- object-factory="classname"allow-return-values="true"> <!-- name参数为必须 -->
- <suite-files>
- <suite-filepath="/path/to/suitefile1"></suite-file> <!-- path参数为必须 -->
- <suite-filepath="/path/to/suitefile2"></suite-file>
- </suite-files>
- <parametername="par1" value="value1"></parameter> <!-- name, value参数为必须 -->
- <parametername="par2" value="value2"></parameter>
- <method-selectors>
- <method-selector>
- <selector-classname="classname" priority="1"></selector-class><!-- name参数为必须 -->
- <scriptlanguage="java"></script> <!-- language参数为必须 -->
- </method-selector>
- </method-selectors>
- <testname="testename" junit="false" verbose="3"parallel="false" thread-count="5"annotations="javadoc"
- time-out="10000"enabled="true" skipfailedinvocationcounts="true"
- preserve-order="true"allow-return-values="true"> <!-- name参数为必须 -->
- <parametername="par1" value="value1"></parameter> <!-- name, value参数为必须 -->
- <parametername="par2" value="value2"></parameter>
- <!-- groups:前提是需要存在classes的组,否则所有方法不被运行 -->
- <groups>
- <!--define:定义新的组名 -->
- <definename="group_name"> <!-- name参数为必须 -->
- <!--group_name1为测试类中方法的Annotation定义的组名 -->
- <includename="group_name1" description=""invocation-numbers="" /> <!-- name参数为必须 -->
- <includename="group_name2" description=""invocation-numbers="" />
- </define>
- <run>
- <!-- group_name为测试类中定义的组名或者xml中定义的组名 -->
- <includename="group_name" /> <!-- name参数为必须 -->
- <excludename="" /> <!-- name参数为必须 -->
- </run>
- <dependencies>
- <groupname="" depends-on=""></group> <!--name,depends-on均为参数为必须 -->
- <groupname="" depends-on=""></group>
- </dependencies>
- </groups>
- <!-- classes的用法,classes中包含类名,类名底下可以包含方法名或排除方法名 -->
- <classes>
- <classname="classname"> <!-- name参数为必须 -->
- <methods>
- <parametername="par3" value="value3"></parameter>
- <includename="method_name" description=""invocation-numbers=""></include>
- <excludename="method_name"></exclude>
- </methods>
- <methods></methods>
- </class>
- </classes>
- <packages>
- <packagename="" /> <!-- name参数为必须 -->
- <packagename="">
- <includename="" description=""invocation-numbers=""></include>
- <excludename=""></exclude>
- </package>
- </packages>
- <listeners>
- <listenerclass-name="classname1" /> <!-- name参数为必须 -->
- <listenerclass-name="classname2" />
- </listeners>
- </test>
- <test>
- </test>
- </suite>
复制代码 2. 使用classes、class标签进行用例管理
在class标签中通过name属性声明实现了测试方法的类,一个classes标签可以包含多个class标签。
在class标签中,还可以通过include和exclude声明该类中的被包含或者被排除在测试用例中的方法。
3. 使用groups进行用例管理
可以指定test方法属于哪些group,一个方法可以属于多个分组。方法属于哪个分组可以在Java代
码中通过Annotation指定,例如:
@Test(groups = {"group_name1","group_name2"})
Public void func()
{
}
指定test方法所属的分组之后,就可以在testng.xml文件中指定要运行的分组,testng.xml文件修改如下:
其中,define标签表示在testng.xml文件中根据存在的分组重新定义分组名称;run标签定义要运行
的分组。
注:
TestNG的group标签导致的@BeforeMethod方法无效,这样,如果group里面的方法对@BeforeMethod
方法有依赖,可能会导致错误。
解决方法:
将@BeforeMethod替换为@BeforeMethod(alwaysRun = true),或者将@BeforeMethod方法也放在
group中。
7 测试报告
7.1 TestNG的测试报告
参考:
7.2 ReportNG的编译
ReportNG的官网上已经申明不再进行维护,当前稳定版本为1.1.4,源代码已经托管到Github,
因此可以根据需要进行定制。
该项目为Maven工程,没有尝试进行编译。但是Eclipse IDE环境已经自带了Maven插件,可以进
行项目的create和build。
注:Maven项目中很多jar包是需要从网络下载的。
7.3 ReportNG的使用
使用步骤:
1. 作为jar包加入工程的build路径;
2. 在testng.xml中的suite标签中添加listener,如下:
- <listeners>
- <listener class-name="org.uncommons.reportng.HTMLReporter"/>
- <listener class-name="org.uncommons.reportng.JUnitXMLReporter"/>
- </listeners>
复制代码 注:
1. reportNG需要guice的支持,下载地址:http://google-guice.googlecode.com/files/guice-3.0.zip
2. reportNG显示中文时会有乱码,解决方法参考:
3. 测试用例跑完之后,可以在test-output目录的html文件夹找到index.html测试报告。
ReportNG 目前有很多缺点,但是由于提供了源代码,可以根据需要自己定制。例如,在测试报告中,
出错的用例的高亮显示没法做,需要自己去修改ReportNG源码才能实现;另外,你可以通过代码修
改静态的html模板去实现报告DIY定制。
8 示例
了解了Appium、TestNG之后,就可以尝试编写测试程序了。文档中测试代码在GitHub的地址:
git@github.com:GitHub-inthewind/CalculatorTestNG.git,是一个基于S2的Calculator编写的测试用例
程序。
8.1 编写测试用例
1)创建Java工程
2)导入Libs,包括Selenium client库,SeleniumServer库,Appium Client库(可以在Appium的官网上
下载,地址:http://appium.io/),testNG,reportNG库;
3)在Java工程目录下新建apps目录,将要测试的APK放在该目录下;
4)创建class,编写测试用例
- public class AndroidCalculatorTestNG {
- privateAppiumDriver<AndroidElement> driver;
-
- @BeforeSuite(alwaysRun = true)
- public void setUp() throws Exception {
- System.out.println("setUp entry");
- // setup appium
- File classpathRoot = new File(System.getProperty("user.dir"));
- File appDir = new File(classpathRoot, "apps");
- File app = new File(appDir, "Calculator.apk");
- DesiredCapabilities capabilities= new DesiredCapabilities();
- //project can run,even if the settings of this following statement is wrong
- capabilities.setCapability("deviceName","0a733f0b");
- capabilities.setCapability("platformVersion", "4.4.4");
- // setthe APK's path
- capabilities.setCapability("app", app.getAbsolutePath());
- capabilities.setCapability("appPackage", "com.android.calculator2");
- capabilities.setCapability("appActivity", "com.android.calculator2.Calculator");
- driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
- System.out.println("setUp end");
- }
-
- @AfterSuite(alwaysRun = true)
- public void tearDown() throws Exception {
- System.out.println("tearDown entry");
- driver.quit();
- System.out.println("tearDown end");
- }
-
-
- @Test(groups = {"funcAdd"}, invocationCount = 1)
- public void add(){
- WebElement num1 = driver.findElementById("digit_1");
- num1.click();
- WebElement add = driver.findElementById("op_add");
- add.click();
- WebElement num2 = driver.findElementById("digit_2");
- num2.click();
- WebElement eq = driver.findElementById("eq");
- eq.click();
-
- }
-
- @Test(groups = {"funcSub"})
- public void sub(){
- WebElement num1 = driver.findElementById("digit_1");
- num1.click();
- WebElement add = driver.findElementById("op_sub");
- add.click();
- WebElement num2 = driver.findElementById("digit_2");
- num2.click();
- WebElement eq = driver.findElementById("eq");
- eq.click();
- }
-
- }
复制代码 5)创建testng.xml文件
testng.xml文件的创建步骤请参考TestNG的编译和使用章节。
如果需要生成reportNG格式的测试报告,需要对testng.xml文件进行修改,如下:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<!—生成reportNG格式的测试报告-->
|
|