数据驱动时在 JUnit 中使用 @Test

Use of @Test in JUnit while data driving

我想弄清楚是否有可能(或者我是否有点傻。)

我有一个非常简单的 Excel sheet - 2 列,一列是搜索词列表,第二列是预期 URL 列表。我通过 selenium 运行,它将导航到 google,打开 Excel sheet,搜索术语,如果出现预期结果,则通过测试。它对 sheet 中的三行执行此操作。都好。但是,我希望 @Test 每一行 - 但我不太清楚如何实现这一点。

下面是测试代码,就像我说的,我不能完全让它工作 - 目前它 运行s 但显示为一个测试,有 3 次不同的搜索。

@Test
@Severity(SeverityLevel.CRITICAL)
public void driveDatData() throws InterruptedException, BiffException, IOException {
    parameters = WebDriverSteps.currentDriver.toString();
    steps.openWebPage("http://www.google.co.uk");

    FileInputStream fi = new FileInputStream("C:\temp\sites.xls");
    Workbook w = Workbook.getWorkbook(fi);
    Sheet s = w.getSheet("Sheet1");

    for (int i=1;i<=s.getRows(); i++) 
    {
        if (i > 1) 
        {
            steps.goToURL("http://www.google.co.uk");
        }

        steps.search(s.getCell("A" + i).getContents());
        Assert.assertTrue("Check the " + s.getCell("A" + i).getContents() + " link is present", steps.checkForTextPresent(s.getCell("B" + i).getContents()));
    }

}

两件事:

我认为将测试数据保存在外部 excel sheet 中对您来说有意义吗?否则,更常见的方法是将测试数据作为测试资源保留在您的项目中。此外,我认为有各种框架可以帮助您从 excel 文件中检索测试数据。

话虽如此:

更改您的代码以将测试数据填充到位于 @Before 的数据结构中,编写不同的 @Test 来测试不同的内容。这也将测试数据的检索与实际测试分开(这在可维护性和责任方面是一件好事)。如果文件读取/性能是一个问题,您可能希望使用 @BeforeClass 每次测试只执行一次 class.

@Before
// read file, store information into myTestData

@Test
// tests against myTestData.getX

@Test
// tests against myTestData.getY

任何好的测试代码复杂度都应该是 1。任何循环都应该用参数化测试代替。请看https://github.com/junit-team/junit/wiki/Parameterized-tests.

我建议您将 Feed4JUnit 添加到您的项目中。 它是高度可配置的,并且是我所知道的唯一可以在 Excel 支持下开箱即用地进行参数化 JUnit 和 TestNG 测试的库。

Feed4Junit

@RunWith(Feeder.class)
public class AddTest {

    @Test
    @Source("http://buildserv.mycompany.com/wiki/myproject/tests/add.xls")
    public void testAdd(int param1, int param2, int expectedResult) {
        int result = MyUtil.add(param1, param2);
        assert result == expectedResult;
    }
}

这个例子直接来自 Feed4Junit 网站。

重要的是要注意参数是从左到右读取的。

每一行都是一个测试,每一列都必须有有效值,即如果一列对 3 行具有相同的值,那么它需要出现在每一行中。

经过一些努力,使用@RunWith 在 JUnit 中实现了这一点。找到了一些例子,虽然不是我想要的,但提供了足够的洞察力让我用 JUnit 来完成这个工作。