TestNG+Extent Report+Selenium POM环境下出现空指针异常
空指针异常解决方案
问题根源
触发NullPointerException的核心原因是类中声明的ExtentTest test变量从未被初始化,在@AfterMethod方法中调用test.log()时,test对象仍为null,导致无法执行日志记录操作。
修复方案
需要为每个测试方法创建对应的ExtentTest实例,推荐在@BeforeMethod中完成初始化,确保每个测试方法执行前都能生成对应的日志追踪对象,避免重复代码。
关键代码调整
- 更新
@BeforeMethod方法,添加Method参数并初始化test对象:
@BeforeMethod public void start_method(Method method) { // 以当前测试方法名创建ExtentTest实例 test = extent.createTest(method.getName()); }
注意需要导入java.lang.reflect.Method类。
2.(可选)也可以在每个@Test方法内部单独初始化test(不推荐,会产生重复代码):
@Test (priority = 0) public void uTest_google() { test = extent.createTest("uTest_google"); // 初始化当前测试方法的日志对象 Google_Search_Page ob1=new Google_Search_Page(driver); ob1.google_search("uTest"); ob1.clickutest(); }
完整修改后的uTest_Method.java代码
package testCases; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.time.Duration; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.aventstack.extentreports.ExtentReports; import com.aventstack.extentreports.ExtentTest; import com.aventstack.extentreports.Status; import com.aventstack.extentreports.reporter.ExtentHtmlReporter; import com.aventstack.extentreports.reporter.configuration.Theme; import pageObjects.Google_Search_Page; import pageObjects.uTest_Home_Page; public class uTest_Method { WebDriver driver; String base_url = "https://www.google.com"; ExtentHtmlReporter reporter; ExtentReports extent; ExtentTest test; @BeforeTest public void launch_test() { reporter=new ExtentHtmlReporter("./uTest_Report/report1.html"); reporter.config().setDocumentTitle("uTest_Automation_Report"); reporter.config().setReportName("Functional_Test"); reporter.config().setTheme(Theme.DARK); extent =new ExtentReports(); extent.attachReporter(reporter); extent.setSystemInfo("Host_Name", "localhost"); extent.setSystemInfo("OS", "Windows10"); // 修正原拼写错误 extent.setSystemInfo("Tester_Name", "PRAJIN"); extent.setSystemInfo("Browser_Name", "Chrome"); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3)); driver.get(base_url); } @BeforeMethod public void start_method(Method method) { // 为每个测试方法创建专属的日志追踪对象 test = extent.createTest(method.getName()); } @Test (priority = 0) public void uTest_google() { Google_Search_Page ob1=new Google_Search_Page(driver); ob1.google_search("uTest"); ob1.clickutest(); } @Test (priority = 1) public void uTest_Home() { uTest_Home_Page ob1=new uTest_Home_Page(driver); ob1.click_become_a_tester(); } @AfterMethod public void exit_method(ITestResult result) throws IOException { if(result.getStatus()==ITestResult.FAILURE) { test.log(Status.FAIL, "TestCase Failed: "+result.getName()); test.log(Status.FAIL, "Failure Reason: "+result.getThrowable()); } else if(result.getStatus()==ITestResult.SKIP) { test.log(Status.SKIP, "TestCase Skipped: "+result.getName()); } else if(result.getStatus()==ITestResult.SUCCESS) { test.log(Status.PASS, "TestCase Passed: "+result.getName()); } } @AfterTest public void exit_test() { extent.flush(); driver.quit(); // 开启该行,避免浏览器进程残留 } }
额外优化说明
- 修正了原代码中
Windws10的拼写错误,改为Windows10 - 调整了
@AfterMethod中的成功日志内容,改为记录测试方法名,更符合日志追踪逻辑 - 建议开启
driver.quit(),避免测试完成后浏览器进程残留占用资源
内容的提问来源于stack exchange,提问作者Prajin T
相关产品推荐
相关产品推荐

