You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TestNG运行测试套件包抛出java.lang.NullPointerException问题求助

问题根因

你遇到的空指针异常核心是TestNG实例隔离+注解范围不匹配导致的:

  1. TestNG会为每个配置在XML里的测试类创建独立的实例,两个实例的属性互不干扰
  2. @BeforeTest注解的作用范围是<test>标签下的所有测试内容,整个<test>执行周期里只会运行一次,你将父类TestCase1_TeacherLogin和子类TestCase2_InternalExaminer都配置在同一个<test>下时,beforeTest只会给TestCase1的实例初始化Properties p属性,子类实例的p属性始终是null,调用p.getProperty就会触发空指针。
  3. 单独跑子类能通过的原因是:此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:04