我正在开发单元测试,在创建测试数据时可以从可重用性中获益很多。但是,我需要对相同的测试数据(API args)执行不同的操作(API调用)。
我想知道Java中是否可以使用以下习语。
Class RunTestScenarios {
void runScenarioOne (A a, B b, C c) {
........
}
void runScenarioTwo (A a, B b, C c) {
........
}
void runScenario (/* The scenario */ scenarioXXX) {
A a = createTestDataA();
B b = createTestDataB();
C c = createTestDataC();
scenarioXXX(a, b, c);
}
public static void main (String[] args) {
runScenario(runScenarioOne);
runScenario(runScenarioTwo);
}
}
基本上,我不希望在任何地方重复以下内容:
A a = createTestDataA();
B b = createTestDataB();
C c = createTestDataC();
据我所知,这样的别名(scenarioXXX)是不可能的,但我很乐意纠正,或者是否有人可以提出可能的设计方案来实现这种效果。
顺便说一句,我知道命令模式可以完成这项工作。但不是我要找的东西。
谢谢, US
答案 0 :(得分:2)
setUp
和tearDown
方法为每个测试初始化新鲜对象。答案 1 :(得分:1)
您可以通过使用接口来实现此目的: -
答案 2 :(得分:1)
不,你不能用Java做到这一点。不是没有lambda支持(不要屏住呼吸......)。您可以在Scala中执行此操作,例如使用ScalaTest。可能还有一些其他JVM语言 在Java中,习惯用异步类包装这些函数,可能实现一个定义要运行的方法的接口。
答案 3 :(得分:1)
我不确定能得到你需要的东西,但在我看来,你可以使用TestNG提供的DataProvider
。
是这样的:
...
@Test(dataProvider="someMethodWithDataProviderAnnotation")
void runScenarioOne (A a, B b, C c) {
...
}
@Test(dataProvider="someMethodWithDataProviderAnnotation")
void runScenarioTwo (A a, B b, C c) {
...
}
然后你就是你的数据提供者:
@DataProvider(name="someMethodWithDataProviderAnnotation")
private Object [][] getTestData() {
return new Object[]][] {{
createTestDataA(),
createTestDataB(),
createTestDataC()
}};
}
就是这样,当你运行测试时,将使用正确的参数调用它们,这些参数只会创建一次。虽然这必须加载大量资源(例如,目录中的所有文件或类似内容)时更有用。
您只需运行课程中的所有方法。
在这里阅读更多内容:
http://testng.org/doc/documentation-main.html#parameters-dataproviders
BTW:TestNG作为插件包含在Intellj IDEA
中