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

Java 数据驱动时在JUnit中使用@Test,java,selenium,junit,allure,Java,Selenium,Junit,Allure,我在试图弄清楚事情是否可能(或者我是否有点傻) 我有一个非常简单的Excel表格-2列,一列是搜索词列表,第二列是预期URL列表。我通过selenium运行它,它将导航到google,打开Excel表格,搜索术语,如果预期结果通过测试。它对工作表中的三行执行此操作。一切都好。然而,我希望@测试每一行-但我不太明白如何实现这一点 下面是测试代码,就像我说的,我不能完全让它工作-目前它运行,但显示为一个单独的测试,有3个不同的搜索 @Test @Severity(SeverityLevel.CRIT

我在试图弄清楚事情是否可能(或者我是否有点傻)

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

下面是测试代码,就像我说的,我不能完全让它工作-目前它运行,但显示为一个单独的测试,有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()));
    }

}
@测试
@严重性(严重级别严重)
public void driveDatData()引发InterruptedException、BiffeException、IOException{
参数=WebDriverSteps.currentDriver.toString();
步骤。打开网页(“http://www.google.co.uk");
FileInputStream fi=新的FileInputStream(“C:\\temp\\sites.xls”);
工作簿w=Workbook.getWorkbook(fi);
表s=w.getSheet(“表1”);
对于(int i=1;i 1)
{
步骤。Gotour(“http://www.google.co.uk");
}
搜索(s.getCell(“A”+i.getContents());
Assert.assertTrue(“检查”+s.getCell(“A”+i).getContents()+“链接存在”,steps.checkForTextPresent(s.getCell(“B”+i).getContents()));
}
}
两件事:

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

话虽如此:

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

@Before
// read file, store information into myTestData

@Test
// tests against myTestData.getX

@Test
// tests against myTestData.getY

对于任何好的测试代码,复杂度都应该是1。应使用参数化测试替换任何循环。请看一下。

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

此示例直接来自Feed4Junit站点

重要注意事项:参数从左到右读取


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

经过一点努力,使用@RunWith在JUnit中实现了这一点。找到了一些示例,虽然这些示例并不完全符合我的要求,但却提供了足够的洞察力,让我能够使用JUnit完成这项工作。

Hi Jan,是的,最好将数据存储在excel工作表中(目前我只是在玩这个概念),但我们可能讨论的数据量相当大。我确实考虑过写大量的不同的测试方法(在计算的情况下)。我想我可以使用循环来检索数据。我不明白为什么不能使用循环?我现在正在接近解决方案-循环没有按预期工作-输出不是我想要的-因此将使用@RunWith并以这种方式构建它。这只是为了提高allure中结果的可读性。我目前使用的是:
@Parameters公共静态集合addedata(){return array.asList(新字符串[][{{“apple”,“www.apple.com”},{“MSN”,“www.MSN.com”},{“yahoo”,”https://uk.yahoo.com“},});
但是,我仍然需要源数据(可以更改)存储在外部,因此需要循环以某种方式解析此excel文件并从中创建
@参数
@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;
    }
}