问题描述
|
我正在开发单元测试,在创建测试数据时,可以从可重用性中受益匪浅。但是,对于相同的测试数据(API参数),我需要做不同的事情(API调用)。
我想知道以下成语在Java中是否可行。
Class RunTestScenarios {
void runScenarioOne (A a,B b,C c) {
........
}
void runScenarioTwo (A a,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)是不可能的,但我很乐意予以纠正,或者如果有人可以提出可能的设计替代方案来实现此效果,我将非常高兴。
顺便说一句,我知道命令模式可以做到这一点。但不是我想要的。
谢谢,
我们
解决方法
使用jUnit。
将a,b和c转换为字段。
使用jUnit的
setUp
和tearDown
方法初始化每个测试的新对象。
, 不,您不能在Java中做到这一点。没有lambda支持(不要屏住呼吸...)。您可以在Scala中执行此操作,例如使用ScalaTest。可能还有其他一些JVM语言。
在Java中,习惯用法是用匿名类包装这些函数,也许实现一个定义要运行的方法的接口。
, 实现此目的的一种方法是使用界面:
修改“ 4”方法以接受该接口作为参数。
为每种场景类型实现接口,并通过场景测试所需的接口。
通常,如果您还不了解Java,则可以使用jUnit完成Java中的单元测试。有许多可用的教程,可以在这里找到这样的教程。
, 我不确定要得到什么,但是在我看来您可以使用TestNG提供的provides5ѭ。
是这样的:
...
@Test(dataProvider=\"someMethodWithDataProviderAnnotation\")
void runScenarioOne (A a,B b,C c) {
...
}
@Test(dataProvider=\"someMethodWithDataProviderAnnotation\")
void runScenarioTwo (A a,C c) {
...
}
然后,您向数据提供者求助:
@DataProvider(name=\"someMethodWithDataProviderAnnotation\")
private Object [][] getTestData() {
return new Object[]][] {{
createTestDataA(),createTestDataB(),createTestDataC()
}};
}
就是这样,当您运行测试时,将使用正确的参数(仅创建一次)调用它们。尽管这在必须加载大量资源的情况下更为有用,例如,目录中的所有文件或类似的东西。
您只需运行该类中的所有方法。
在这里阅读更多:
http://testng.org/doc/documentation-main.html#parameters-dataproviders
顺便说一句:TestNG作为Intellj IDEA的插件包含在内