数据驱动时在 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 测试的库。
@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 来完成这个工作。
我想弄清楚是否有可能(或者我是否有点傻。)
我有一个非常简单的 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 测试的库。
@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 来完成这个工作。