如何以编程方式为TestNG创建测试?

时间:2013-01-28 15:29:29

标签: java automation testng

我正在编写一个库来为我的JPA @Entity类自动生成单元测试。简而言之:用户提供字段的多重映射 - >值对和我的库为它们生成测试。

示例测试数据:

lastName -> some name, some other name
firstName -> some first name, some other first name

假设我有一个包含测试的类:

public class PersonTest
{
    @Test
    public void personNotValidNullLastname() {
        // ...
    }

    @Test
    public void personNotValidTooLongLastname() {
        // ...
    }

    @Test
    public void personNotValidDateofbirth() {
        // ...
    }

    @Test
    public void personValidAddressType() {
       // ...
    }
    // ...
}

如果我执行这些测试,我会从TestNG控制台获得一些不错的输出:

PASSED: personNotValidDateofbirth
PASSED: personNotValidNullLastname
PASSED: personNotValidTooLongLastname
PASSED: personValidAddressType

现在我想要动态创建一些测试。如果我使用@Factory注释使用这样的方法:

@Factory
public Object[] generateTests() {
    // ...
}

这个工厂创建我的自定义类的实例:

public class EntityFieldTest
{
    // ...

    @Test
    public void doTest()
    {
        testMethod.run(VALIDATOR, entityClass, field, value);
    }
}

// Note that testMethod is an anonymous function parametrized elsewhere

它会运行我生成的所有测试,但输出并不多说:

PASSED: doTest
PASSED: doTest
PASSED: doTest
PASSED: doTest

如何执行我的测试方法以获得更详细的结果,例如PersonTest

4 个答案:

答案 0 :(得分:3)

EntityFieldTest实施org.testng.ITest并覆盖getTestName()。您提到您正在工厂内创建EntityFieldTest的实例,因此提供一个EntityFieldTest构造函数,该构造函数接收一个表示该测试名称的字符串。然后在getTestName()中返回该值。

答案 1 :(得分:0)

您可以创建自定义记录器:http://testng.org/doc/documentation-main.html#logging并生成您喜欢的报告。

答案 2 :(得分:0)

看起来你应该使用一些验证器类。想要确保已经创建核心测试是一个好主意,但是除了提供存根之外的任何能量都可以更好地放入实际验证属性状态的类中。

答案 3 :(得分:0)

您检查了DataProviders吗?

它将为您提供为测试用例提供数据的选项。您也可以从文件中读取测试用例输入并传递给测试函数。每个@Test方法都需要使用@Dataprovider进行注释(name = ..,[class = ..]

所以你的personValidAddressType看起来像

@Test(dataProvider = "validAddressType", dataProviderClass = TestCaseData.class)
public void personValidAddressType(TestCase testCase) {...}

在TestCaseData中,

@DataProvider(name = "validAddressType")
public static Iterator<Object[]> getTestCases() {
    //returns your test case
}

在所提到的链接中的示例在类似的场景中对我有帮助。您还可以使用dataprovider返回Object [] []而不是迭代器