抱歉,我想不出更好的标题。
我正在为我们网站的销售流程(包含 4 个步骤)创建一个自动化 API 测试。当您启动销售流程时,您会得到一个 key ,需要在销售流程的每个步骤中传递该 key 。
我想为每 4 个步骤创建一个单独的 Junit 测试。我写了一个启动并返回 key 的方法:
public String initiate_salesflow() throws Throwable {
RestAssured.baseURI = "http://localhost:8080";
String res = given().
when().
get("/salesflow/initiate").
then().
contentType(ContentType.JSON).
extract().
path("stackId");
return res;
我创建了一个实例变量来保存返回的 key ,并创建供其他测试使用的 url:
private String URL = "http://localhost:32768/salesflow/"+initiate_salesflow();
但是,每次我的每个 junit 测试运行时,上面的方法都会创建一个新 key ,当我希望它们全部匹配时。我知道 @BeforeClass 可以运行该方法一次,但是有没有办法将返回值传递给其他测试?
谢谢
最佳答案
前提:您希望所有四个测试都使用一个相同的 key ,尽管它们是四个不同的测试。
考虑到这一点,我必须指出,如果您的四个单独测试必须协同工作以完成单个业务任务,则它们不是单元测试。换句话说,如果这四个步骤中的任何一个失败,您的业务任务就失败了。
这不适合 @Before
因为它用于设置每个单独的测试,如果您使用 JUnit 之类的东西进行测试,您会发现该类可能会为每个单独的个体重新实例化测试,因此即使预先分配变量也可能不起作用。
这就是您描述的情况。
public class Test {
private String testKey;
private String generateKey() {
return String.valueOf(new Date().getTime());
}
@Before
public void setUp() {
testKey = generateKey();
}
@Test
public void testA() {
System.out.println(testKey);
}
@Test
public void testB() {
System.out.println(testKey);
}
//... etc
}
最终发生的是每个测试最终都会获得一个新 key ,因此在这种情况下,testA 的 key 和 testB 的 key 是不同的时间戳。
testKey
对于这两个测试永远不会相同,因为时间戳会改变。
解决方案是将四个单独的步骤提取到一个 super 测试中。
public class Test {
private String testKey;
private String generateKey() {
return String.valueOf(new Date().getTime());
}
@Before
public void setUp() {
testKey = generateKey();
}
@Test
public void superTest() {
testA();
testB();
testC();
//...
}
private void testA() {
System.out.println(testKey);
}
private void testB() {
System.out.println(testKey);
}
//... etc
}
如果这四个步骤中的任何一个失败,假设您的测试失败,superTest
实现仍将履行契约(Contract),因为任何 Assert.fail()
调用都会使该测试失败。如果每个单独的测试仍然可以作为独立单元工作,您可以将 @Test
符号添加回它们并删除 private
签名。
如果您使用的是像 EasyMock 这样的模拟框架,您可能必须在每次方法调用后重置模拟状态。
关于java - 为所有 Junit 测试创建一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43925025/