详细的结介绍:
https://blog.csdn.net/lovedingd/article/details/106784561
这半年面试了很多候选人,大多数候选人都会在简历上写上自己公司的接口自动化框架或者UI自动化框架。在大多数框架的实现方式中,都会写到一个TestNG。然后我们展开了如下的对话。
A:看你们这边用到了TestNG,那你对它了解多少呢?
M:我知道这是个单元测试的框架。它比较有名的是注解。
A:那你们有用到什么注解嘛?
M:我们只用到了@Test……
A:那你们@Test的参数是如何运用的呢?
M:好像没有……
鉴于我们在设计接口测试框架或者UI自动化框架的时候,大概率都会用到TestNG,且大多数同学对这个框架其他的应用一无所知,我们就写一个关于
TestNG的系列。
TestNG的官方文档:http://testng.org/doc/index.html
TestNG有几个显著且好用的特点。
- 大名鼎鼎的注解功能,系列中会写到各个注解的作用及示例
- 测试组的概念
- 多线程测试
- 支持依赖测试方法,并行测试,负载测试,局部故障
那TestNG有以上这些特点,怎么集成进你的框架并使用呢?
第一步:你需要确认已经配置了Java环境。
第二步:1、项目中配置了maven,则引入以下依赖就行
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> </dependency>
2、如果没有maven,则可以直接引入TestNG.jar即可
第三步:编写测试业务逻辑,在代码中插入TestNG的注解
第四步:在TestNG对应的配置文件testng.xml或build.xml中配置测试信息
第五步:运行TestNG即可
前面一直提到注解的好处,那我们就从运用最广泛的@Test注解开始说起。被@Test标注的方法或者类则是我们对应的一条测试用例。如下面的代码显示,
runTest1、runTest2分别是我们自己写的两条测试用例。
package com.tester; import org.testng.annotations.Test; public class TestInterface { @Test public void runTest1() { System.out.println("@Test - runTest1"); } @Test public void runTest2() { System.out.println("@Test - runTest2"); } }
@Test就这么简单?No,它的精华在于它的以下几个参数。
- groups:组测试,一个test属于哪一个组,可以跑一个特定组的所有test
- dependsOnMethods、dependsOnGroups:依赖测试,一个test依赖于另一个test的执行结果
- expectedExceptions:异常测试
- dataProvider:参数化测试,将参数传入该test
- enabled:忽略测试,不执行该test
- timeOut、threadPoolSize、invocationCount、successPercentage:并发测试,设置并发测试的各种参数
- alwaysRun:如果为true的话,不管怎样都会运行
这次先介绍TestNG的一个创新,组测试。它不存在于JUnit框架,它允许你执行一个测试组内的所有测试用例。你不仅可以声明一个测试用例属于哪个组,你也可以指定一组包含其他组。然后,TestNG可调用和要求包括一组特定的群体(或正则表达式),而排除另一个集合。这就给了我们最大的灵活性,如何分区测试,如果想运行两套不同的测试背靠背,不需要重新编译任何东西,只需要运行不同的组即可。
package com.tester; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; public class TestGroup { @Test(groups = "appium-test") public void runAppium() { System.out.println("runAppium()"); } @Test(groups = "appium-test") public void runAppium1() { System.out.println("runAppium1()"); } @Test(groups = "interface-test") public void testConnectOracle() { System.out.println("testConnectOracle()"); } @Test(groups = "interface-test") public void testInterface() { System.out.println("testInterface()"); } }
以上代码,我们可以看到,声明了2个测试组appium-test、interface-test,每个测试组下面分别有2个测试用例。还有如下代码所示,直接将整个类归为一个测试组的情况。
package com.tester; import org.testng.annotations.Test; @Test(groups = "selenium-test") public class TestSelenium { public void runSelenium() { System.out.println("runSelenium()"); } public void runSelenium1() { System.out.println("runSelenium()1"); } }
那怎么运行呢?上面提到需要配置对应的testng.xml,我们将对应的testng.xml写成如下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="TestAll"> <!-- 只跑selenium-test这个测试组 --> <test name="selenium"> <groups> <run> <include name="selenium-test" /> </run> </groups> <classes> <class name="com.tester.TestSelenium" /> <class name="com.tester.TestGroup" /> </classes> </test> </suite>
当然,一个测试方法或者一个类,也可以同时属于多个组。
@Test(groups = {"appium","uiautomator"}) public void testUI() { System.out.println("testUI"); }