TestNG(一)
详细的结介绍:
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,则引入以下依赖就行
1 2 3 4 5 | <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分别是我们自己写的两条测试用例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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可调用和要求包括一组特定的群体(或正则表达式),而排除另一个集合。这就给了我们最大的灵活性,如何分区测试,如果想运行两套不同的测试背靠背,不需要重新编译任何东西,只需要运行不同的组即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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个测试用例。还有如下代码所示,直接将整个类归为一个测试组的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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写成如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?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> |
当然,一个测试方法或者一个类,也可以同时属于多个组。
1 2 3 4 | @Test (groups = { "appium" , "uiautomator" }) public void testUI() { System.out.println( "testUI" ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)