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

如何为TestNG驱动的API测试构建基类以消除重复代码

问题描述

我用核心Java+Maven搭建了一套大型TestNG驱动的API测试框架,每个API端点对应一个Java类。每个类里都通过TestNG的@BeforeTest注解初始化Restassured端点并选择环境(Mock/prod/pre/qa等),代码示例如下:

public class MY_PUBLIC_API_PRISM_GET_ACCOUNTS {
    Response response;
    EndPoints endpoints;
    String jwtToken = "";


    @BeforeTest
    public void beforeTest(ITestContext itestContext) {
        endpoints = new EndPoints();
        jwtToken= (String) itestContext.getAttribute("JWTToken");
        endpoints.chooseEndPoint("PRISM_MOCK_PORT"); // <--- 环境选择
    }
..
..
}

现在每个类都重复这段@BeforeTest样板代码,我想把它统一到一处来高效管理端点选择,但尝试构建BaseTest类时遇到了NullPointerException,该怎么实现?

解决方案

1. 编写正确的BaseTest基类

将重复的初始化逻辑抽离到基类中,确保@BeforeTest方法正确初始化共享资源,子类继承后可直接复用:

import org.testng.ITestContext;
import org.testng.annotations.BeforeTest;
import io.restassured.response.Response;

public class BaseTest {
    protected Response response;
    protected EndPoints endpoints;
    protected String jwtToken;

    @BeforeTest
    public void setupBase(ITestContext itestContext) {
        endpoints = new EndPoints();
        jwtToken = (String) itestContext.getAttribute("JWTToken");
        // 可通过系统变量/配置文件动态获取环境,避免硬编码
        String env = System.getProperty("test.env", "PRISM_MOCK_PORT");
        endpoints.chooseEndPoint(env);
    }
}

2. 子类继承BaseTest并移除重复代码

子类只需继承BaseTest,无需再编写@BeforeTest方法,直接使用基类中初始化好的变量即可:

public class MY_PUBLIC_API_PRISM_GET_ACCOUNTS extends BaseTest {
    @Test
    public void testGetAccounts() {
        // 直接使用基类的endpoints和jwtToken发起请求
        response = given()
                        .header("Authorization", "Bearer " + jwtToken)
                        .when()
                        .get(endpoints.getAccountEndpoint());
        
        // 测试断言逻辑
        response.then().statusCode(200);
    }
}

3. 排查NullPointerException的常见原因

  • 避免变量覆盖:子类中不要重新声明与基类同名的变量(比如EndPoints endpoints;),否则会覆盖基类初始化的实例,导致空指针。
  • 检查上下文属性:确认JWTToken已通过itestContext.setAttribute("JWTToken", token)正确存入TestNG上下文,若属性不存在会返回null。
  • 验证EndPoints类逻辑:检查EndPoints构造方法是否正常初始化,chooseEndPoint方法内部是否存在空指针风险(比如未处理null参数)。
  • 确认TestNG执行顺序:TestNG默认会优先执行基类的@BeforeTest再执行子类测试方法,若自定义了执行顺序,需确保基类初始化逻辑先触发。

4. 优化:动态切换环境(可选)

为了更灵活地切换环境,可在pom.xml中配置profile:

<profiles>
    <profile>
        <id>mock</id>
        <properties>
            <test.env>PRISM_MOCK_PORT</test.env>
        </properties>
    </profile>
    <profile>
        <id>qa</id>
        <properties>
            <test.env>PRISM_QA_PORT</test.env>
        </properties>
    </profile>
</profiles>

运行时指定profile即可切换环境:

mvn test -P qa

内容的提问来源于stack exchange,提问作者user2451016

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:15:25