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