考虑一个例子:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderExampleTest {
@Test(dataProvider="data")
public void testDataProvider(int p1, String p2) {
/*
assert block for all p1 and p2 parameters
*/
// ???
// how to put p1 and p2 specific assertions here?
//jst for example
if (p2.equals("myString")) {
//asserts for myString
}
if (p2.equals("otherString")) {
//asserts for otherString
}
}
@DataProvider
public Object[][] data() {
return new Object[][]{/*dozen objects here*/};
}
}
示例是简化,在现实生活中p1
和p2
可以是非常复杂的对象,其子类需要复杂的断言。
testng是否提供了一些api来将参数的特定断言置于某处,但是没有创建太长的if
或switch
条件?
(我认为if
和switch
就像测试中的重复业务逻辑一样,应该避免使用)
同样的数据驱动开发方法建议在这种情况下使用通用算法检查all
元素,但只有少数具有特定的算法?
答案 0 :(得分:0)
我可能会以不同方式组织我的测试。基于testName,dataprovider将返回数据。我会进行三次测试
将方法参数传递给dataprovider。数据提供者决定根据测试名称发送数据。
答案 1 :(得分:0)
您可以使用Hamcrest或Truth等框架将您的断言组织在一起。在Hamcrest中,您可以创建自定义匹配器,在Truth中,您可以创建自己的主题。有关详细信息,请参阅The Hamcrest Tutorial和Truth - Extensibility的编写自定义匹配器部分。
您也可以通过创建在其中执行多个断言的静态实用程序方法来组织断言,如果您希望使用更流畅的代码,那么您可以将测试从Java转换为像Kotlin那样的语言。支持extension functions(另见Converting an existing Java file to Kotlin with J2K)。