TestNG运行测试套件包抛出java.lang.NullPointerException问题求助
问题根因
你遇到的空指针异常核心是TestNG实例隔离+注解范围不匹配导致的:
- TestNG会为每个配置在XML里的测试类创建独立的实例,两个实例的属性互不干扰
@BeforeTest注解的作用范围是<test>标签下的所有测试内容,整个<test>执行周期里只会运行一次,你将父类TestCase1_TeacherLogin和子类TestCase2_InternalExaminer都配置在同一个<test>下时,beforeTest只会给TestCase1的实例初始化Properties p属性,子类实例的p属性始终是null,调用p.getProperty就会触发空指针。- 单独跑子类能通过的原因是:此时TestNG只会创建子类一个实例,
@BeforeTest会正常执行初始化p,所以不会报错。
另外你代码还有一个隐藏问题:@BeforeMethod注解会在每个@Test方法执行前都新开一个Chrome窗口,父类的登录方法跑完之后,新开的浏览器没有登录状态,就算解决了空指针问题,后续找页面元素也会失败。
修复步骤
1. 修正TestNG XML配置
因为子类已经继承了父类,父类的测试方法、注解方法都会自动按优先级执行,不需要在XML里重复配置父类,修改后配置如下:
<?xml version="1.0" encoding="UTF-8"?> <suite name="My package"> <test name="My test"> <classes> <class name="Teacher.TestCase2_InternalExaminer"/> </classes> </test> </suite>
2. 调整注解范围复用浏览器(可选,推荐)
如果要复用同一个浏览器保持登录状态,把@BeforeMethod改成@BeforeClass,并增加测试结束后关闭浏览器的逻辑,修改TestCase1_TeacherLogin代码:
// 导入新增注解的包 import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; // 替换原来的@BeforeMethod @BeforeClass public void beforeClass() throws IOException { System.setProperty("webdriver.chrome.driver", "C:\\Users\\admin\\Desktop\\Software Testing\\testing softwares\\chromedriver.exe"); d=new ChromeDriver(); d.get(p.getProperty("url")); d.manage().window().maximize(); d.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } // 新增关闭浏览器方法 @AfterClass public void afterClass() { if(d != null) { d.quit(); } }
3. 多测试类场景兼容方案(可选)
如果你后续需要在同一个<test>下配置多个独立的测试类,把@BeforeTest改成@BeforeClass,保证每个类实例都会初始化p属性,避免空指针。
内容的提问来源于stack exchange,提问作者Sanket
相关产品推荐
相关产品推荐

