带有 TestNG 的 Java 丢失初始化变量

问题描述 投票:0回答:3

出现令人惊讶的情况,我无法理解。我使用 RestAssured(宠物项目)进行测试自动化。我想在父类中的

RequestSpecification spec
方法中准备
@BeforeSuite
变量。然后我想在子类的测试中使用
spec
变量。这是父类的代码

public class BaseTest {

private String baseUrl = "https://api.thecatapi.com/v1/";
protected RequestSpecification spec;

@BeforeSuite
public void beforeSuite() {
    String apiKey = System.getProperty("api_key");
    spec = new RequestSpecBuilder()
            .setContentType(ContentType.JSON)
            .setBaseUri(baseUrl)
            .addHeader("x-api-key", apiKey)
            .addFilter(new ResponseLoggingFilter())
            .addFilter(new RequestLoggingFilter())
            .addFilter(new AllureRestAssured())
            .build();
    }
}

这是儿童班的测试'

public class OurLittleTest extends BaseTest {

@Test
public void test() {
    //1
    String id = Breeds.search(spec, "Scottish Fold").then().extract().body().jsonPath().get("[0].id");

问题是测试中的

spec
变量为空,而我在等待时它不会为空...

为什么会发生这种情况?为什么

spec
为空?

我录制了一个截屏视频,您可以在其中看到我的问题

更新 Junit 5 一切都很好。子类中的

spec
变量不再为 null。这是我的
build.gradle
文件:

使用 TestNG:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.qameta.allure:allure-gradle:2.8.1"
    }
}

plugins {
    id 'java'
    id 'io.qameta.allure' version '2.8.1'
}

sourceCompatibility = JavaVersion.VERSION_1_8

allure {
    configuration = 'testImplementation'
    version = '2.7.0'
    allureJavaVersion = '2.7.0'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.5'
    implementation 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
    implementation 'io.rest-assured:rest-assured:4.4.0'
    implementation group: 'io.qameta.allure', name: 'allure-rest-assured', version: '2.14.0'
    implementation "io.qameta.allure:allure-testng:2.14.0"
    testImplementation group: 'org.testng', name: 'testng', version: '7.3.0'
}

test {
    useTestNG() {
        parallel = 'methods'
        threadCount = 2
    }
    if (project.hasProperty("api_key")) {
        systemProperties.put("api_key", "$api_key")
    }
}

使用 Junit 5:

plugins {
    id 'io.qameta.allure' version '2.5'
    id 'java'
}

allure {
    configuration = 'testImplementation'
    version = '2.7.0'

    useJUnit5 {
        version = '2.7.0'
    }

}

sourceCompatibility = JavaVersion.VERSION_1_8

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.5'
    implementation 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
    implementation 'io.rest-assured:rest-assured:4.4.0'
    implementation group: 'io.qameta.allure', name: 'allure-rest-assured', version: '2.14.0'
    implementation group: 'io.qameta.allure', name: 'allure-junit5', version: '2.14.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.2.0'
}

test {
    useJUnitPlatform{
        systemProperty 'junit.jupiter.testinstance.lifecycle.default'         , 'per_class'
        systemProperty 'junit.jupiter.execution.parallel.enabled',              'true'
        systemProperty 'junit.jupiter.execution.parallel.mode.default',         'same_thread'
        systemProperty 'junit.jupiter.execution.parallel.mode.classes.default', 'concurrent'
    }
    if (project.hasProperty("api_key")) {
        systemProperties.put("api_key", "$api_key")
    }
}

TestNG 有什么问题吗?

java testng
3个回答
0
投票

问题是

@BeforeSuite
的使用。它意味着每个套件仅使用一次,并在后续运行中被忽略。

要初始化规范,您可以直接在字段中内嵌,如

protected RequestSpecification spec = new RequestSpecBuilder()...
或使用
@BeforeClass


0
投票

我测试了你的代码,没有错误。问题可能出在您使用 Junit 的

OurLittleTest
类中,并且您在
BaseTest

中使用 testNG

0
投票

如果您有一个用例只在基类中为所有子类测试设置一次变量,则可以在基类中使用静态变量。

一旦在基类中设置,它将在所有子类测试中可用。

© www.soinside.com 2019 - 2024. All rights reserved.