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

时间:2015-03-19 20:24:48

标签: java selenium junit allure

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

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

下面是测试代码,就像我说的那样我无法完成这项工作 - 目前它已经运行但是看起来像是一个有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()));
    }

}

4 个答案:

答案 0 :(得分:0)

一些事情:

我认为将测试数据放在外部Excel工作表中是有意义的吗?否则,更常见的方法是将项目中的测试数据作为测试资源。另外我认为有各种各样的框架可以帮助您从excel文件中检索测试数据。

说完这个:

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

@Before
// read file, store information into myTestData

@Test
// tests against myTestData.getX

@Test
// tests against myTestData.getY

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议您将 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行相同的值,那么它需要出现在每一行中。

答案 3 :(得分:0)

经过一些努力,设法使用@RunWith在JUnit中工作。找到了一些例子,虽然不是我想要的,却给了我足够的洞察力,让我用JUnit来解决这个问题。