我想不出一个更好的标题抱歉。
我正在为我们网站的销售流程创建一个自动api测试(有4个步骤)。当您启动销售流程时,您将获得一个需要在销售流程的每个步骤传递的密钥。
我想为每4个步骤创建一个单独的Junit测试。我已经写了一个方法启动并返回密钥:
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;
我创建了一个实例变量来保存返回的密钥,并创建其他测试的url:
private String URL = "http://localhost:32768/salesflow/"+initiate_salesflow();
然而,每当我的每个junit测试运行上面的方法时,都会创建一个新密钥,当我希望它们全部匹配时。我理解@BeforeClass可以运行一次该方法但是有没有办法将返回的值传递给其他测试?
由于
答案 0 :(得分:1)
前提:您需要一个IDENTICAL键用于所有四个测试,尽管它们是四个不同的测试。
考虑到这一说法,我必须指出,如果他们必须共同完成单个业务任务,那么您的四个单独测试不是单元测试。换句话说,如果这四个步骤中的任何一个失败,那么您的业务任务就失败了。
这不适用于@Before
,因为它用于设置每个单独的测试,如果您使用类似JUnit的测试,您会发现可以为每个单独的测试重新实例化Class,所以甚至预先分配变量可能不起作用。
这就是你所描述的情况。
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
}
最终发生的事情是每个测试最终都会获得一个新密钥,因此testA的密钥和testB的密钥在这种情况下是不同的时间戳。
testKey
对于这两个测试永远不会相同,因为时间戳会改变。
解决方案是将四个单独的步骤提取到单个超级测试中。
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
实施仍将履行合同,因为任何Assert.fail()
调用都将无法通过该测试。如果每个单独的测试仍然可以作为独立单元运行,您可以将@Test
符号添加回它们并删除private
签名。
如果您使用像EasyMock这样的模拟框架,则可能需要在每次方法调用后重置模拟状态。
答案 1 :(得分:0)
public class Test {
private String key;
@BeforeClass
public void setUp(){
key = yourMethod();
}
@Test
public void test1(){
// another test using the key
}
}