出现令人惊讶的情况,我无法理解。我使用 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 有什么问题吗?
问题是
@BeforeSuite
的使用。它意味着每个套件仅使用一次,并在后续运行中被忽略。
要初始化规范,您可以直接在字段中内嵌,如
protected RequestSpecification spec = new RequestSpecBuilder()...
或使用 @BeforeClass
。
我测试了你的代码,没有错误。问题可能出在您使用 Junit 的
OurLittleTest
类中,并且您在 BaseTest
类 中使用 testNG
如果您有一个用例只在基类中为所有子类测试设置一次变量,则可以在基类中使用静态变量。
一旦在基类中设置,它将在所有子类测试中可用。