使用TestNG XML分组运行测试类时出现NullPointerException
问题
我是Selenium新手,尝试通过XML文件运行两个已分组的测试类。但在XML中添加<groups>标签执行smoke组时抛出NullPointerException,直接运行类则正常。
我已尝试在@BeforeMethod中初始化WebDriver,但使用<groups>标签指定分组时,Driver并未完成初始化。
XML文件内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Annotation running"> <test name="Annotation Test Runner With Group!" > <groups> <run> <include name="smoke"/> </run> </groups> <classes> <class name="DemoPractise.Annotation"/> <class name="DemoPractise.annotation2"/> </classes> </test> </suite>
错误日志
java.lang.NullPointerException at DemoPractise.Annotation.test2_BtsListBox(Annotation.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.testng.TestRunner.privateRun(TestRunner.java:848) at org.testng.TestRunner.run(TestRunner.java:621) at org.testng.SuiteRunner.runTest(SuiteRunner.java:443) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397) at org.testng.SuiteRunner.run(SuiteRunner.java:336) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280) at org.testng.TestNG.runSuitesLocally(TestNG.java:1200) at org.testng.TestNG.runSuites(TestNG.java:1114) at org.testng.TestNG.run(TestNG.java:1082) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105) java.lang.NullPointerException at DemoPractise.annotation2.test4_JQueryListBox(annotation2.java:32) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.testng.TestRunner.privateRun(TestRunner.java:848) at org.testng.TestRunner.run(TestRunner.java:621) at org.testng.SuiteRunner.runTest(SuiteRunner.java:443) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397) at org.testng.SuiteRunner.run(SuiteRunner.java:336) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280) at org.testng.TestNG.runSuitesLocally(TestNG.java:1200) at org.testng.TestNG.runSuites(TestNG.java:1114) at org.testng.TestNG.run(TestNG.java:1082) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105) =============================================== Annotation running Total tests run: 2, Passes: 0, Failures: 2, Skips: 0 =============================================== Process finished with exit code 0
解决方案
核心问题是TestNG按分组执行时,仅会触发与测试方法同组的前置方法。如果你的@BeforeMethod未标记smoke分组,分组执行时该方法不会运行,导致WebDriver未初始化,最终抛出空指针异常。
方法一:给@BeforeMethod添加分组标记
在测试类中,给初始化WebDriver的@BeforeMethod添加groups属性,确保分组执行时前置方法被调用:
import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class Annotation { private WebDriver driver; @BeforeMethod(groups = {"smoke"}) public void setUp() { // WebDriver初始化代码 driver = new ChromeDriver(); driver.manage().window().maximize(); } @Test(groups = {"smoke"}) public void test2_BtsListBox() { // 此处使用driver执行操作不会空指针 driver.get("https://example.com"); } }
方法二:XML配置强制执行所有前置方法
若不想给每个前置方法加分组标记,可在XML的<test>标签中添加方法选择器,强制执行所有前置方法:
<test name="Annotation Test Runner With Group!" preserve-order="true"> <groups> <run> <include name="smoke"/> </run> </groups> <method-selectors> <method-selector> <script language="javascript"> <![CDATA[ return true; ]]> </script> </method-selector> </method-selectors> <classes> <class name="DemoPractise.Annotation"/> <class name="DemoPractise.annotation2"/> </classes> </test>
额外检查点
- 确认测试方法已标记
@Test(groups = {"smoke"}),否则XML分组配置不会选中这些方法 - 检查WebDriver初始化代码是否存在配置错误(如驱动路径问题),不过直接运行类正常的话,此可能性较低
内容的提问来源于stack exchange,提问作者Kaiser
相关产品推荐
相关产品推荐

