TestNG POM框架配置parallel=false仍未按顺序执行测试类问题
问题背景
基于Selenium Java搭建简易Page Object Model(POM)自动化测试框架,框架设计规则为1个.java类对应1个独立测试场景。testng.xml仅配置单个测试类时,执行逻辑完全符合预期。
单测试类正常运行配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite thread-count="1" name="Test Simple Suite" parallel="false"> <listeners> <listener class-name="com.proj.Listener.Listeners"></listener> </listeners> <test thread-count="1" name="Test Basic Scenario1" parallel="false"> <classes> <class name="TC001_SampleCase"/> </classes> </test> </suite>
异常表现
在同一<test>标签的<classes>节点下新增第二个测试类配置后,两个测试类未按配置声明顺序串行执行,出现方法交叉执行的情况,不符合测试类按配置顺序依次执行的预期,异常配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite thread-count="1" name="Test Simple Suite" parallel="false"> <listeners> <listener class-name="com.proj.Listener.Listeners"></listener> </listeners> <test thread-count="1" name="Test Basic Scenario1" parallel="false"> <classes> <class name="TC001_SampleCase"/> <class name="TC002_SampleCase"/> </classes> </test> </suite>
现有环境与配置说明
- 两个测试类的
@Test方法均配置priority优先级:TC001_SampleCase共20个测试方法,优先级为120;`TC002_SampleCase`共15个测试方法,优先级为2135 - suite、test层级均已配置
parallel="false"、thread-count="1",未开启并行执行 - 组件版本:TestNG 7.3,Selenium 3.141.59
根因分析
- TestNG默认
group-by-instances配置为false,该模式下会将当前<test>标签下所有类的测试方法拉通,按priority、方法名等规则全局排序调度,不会保证同一个类的方法连续执行,即使priority按类分段设置,在7.3版本的排序逻辑bug影响下也会出现跨类穿插的问题 - TestNG 7.3版本存在已知的测试方法排序缺陷,在多类同test场景下会出现排序结果与预期不符的问题
- 未显式配置
preserve-order属性,部分特定版本下该属性默认值可能不为true,导致类、test标签的声明顺序不生效
修复方案
按以下步骤调整即可实现按xml声明顺序串行执行测试类:
- 修改testng.xml的
<suite>标签,新增两个配置属性,修改后示例:
<suite thread-count="1" name="Test Simple Suite" parallel="false" preserve-order="true" group-by-instances="true">
preserve-order="true":强制TestNG按xml中声明的先后顺序执行test标签、class标签group-by-instances="true":保证同一个测试类的所有方法(含配置的优先级方法、前后置方法)全部执行完成后,再调度执行下一个测试类的方法,从调度逻辑上杜绝跨类交叉执行
- (可选)将TestNG版本升级至7.5及以上稳定版本,修复7.3版本存在的排序逻辑bug
- (规范建议)priority为test级别全局生效的属性,无需跨类设置连续优先级值,每个测试类内部的priority可单独从1开始计数,配合
group-by-instances="true"即可保证类内方法按优先级执行、类之间按xml声明顺序执行。
内容的提问来源于stack exchange,提问作者Kartikay
相关产品推荐
相关产品推荐

