如何组织断言来测试数据驱动的测试?
考虑一个例子:
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
元素,但只有少数具体的?
我可能会组织我的测试不同。 基于testName,数据提供者将返回数据。 我会有三个测试
- testCommons
- testString1
- testOtherString
传递给数据提供者的方法参数。 数据提供者决定根据测试的名称发送数据。
你可以使用Hamcrest或Truth这样的框架来组织你的断言。 在Hamcrest中,您可以创建自定义匹配器,而在Truth中,您可以创建自己的主题。 有关详细信息,请参阅Hamcrest教程和真相 – 可扩展性的写入自定义匹配器部分。
您也可以通过创建静态实用程序方法来简单地组织断言,在静态实用程序中执行多个断言,如果您想要更流利的代码,那么您可以将测试从Java转换为支持扩展功能的 Kotlin等语言(另请参阅转换用J2K将Kotlin存在的Java文件 )。