背景故事
我在一家软件公司工作,正在开发一个测试自动化框架来取代我们旧的意大利面条纠缠不清的系统。
由于我们的系统几乎要求我们所做的所有事情都需要登录,因此我决定最好使用@BeforeMethod、@DataProvider 和@Factory 来设置我的测试。但是,我遇到了一些问题。
示例测试用例
可以说软件系统是一个棒球队名册。我们想要测试以确保用户可以按姓名搜索团队成员。
(注意:我知道 BeforeMethods 不会以任何给定的顺序运行——假设现在已经处理好了。)
@BeforeMethod
public void setupSelenium() {
// login with username & password
// acknowledge announcements
// navigate to search page
}
@Test(dataProvider="players")
public void testSearch(String playerName, String searchTerm) {
// search for "searchTerm"
// browse through results
// pass if we find playerName
// fail (Didn't find the player)
}
这个测试用例假设如下:
- 用户已经登录(很可能是在 BeforeMethod 中)
- 用户已经导航到搜索页面(微不足道,之前的方法)
- 测试的参数与上述登录相关联
问题
因此,让我们尝试弄清楚如何处理测试用例的参数。
想法#1
这种方法允许我们将数据提供者与用户名相关联,并允许我们为任何特定的测试用例使用多个用户!
@Test(dataProvider="players")
public void testSearch(String user, String pass, String name, String search) {
// login with user/pass
// acknowledge announcements
// navigate to search page
// ...
}
...但是有很多重复,因为我们必须让每个函数都接受两个额外的参数。更不用说,我们还在测试确认公告功能,我们实际上并不想测试。
想法#2
因此,让我们使用工厂来正确初始化事物!
class BaseTestCase {
public BaseTestCase(String user, String password, Object[][] data);
}
class SomeTest {
@Factory
public void ...
}
有了这个,我们最终不得不为每个测试用例编写一个工厂......虽然,它确实让我们每个测试用例有多个用户。
结论
我的想法很新鲜。我有另一个想法,我从 XML 文件加载数据,然后从程序中调用方法……但它变得愚蠢。
有任何想法吗?