我正在使用TestNG和Selenium WebDriver为webapp编写测试套件.
我需要的是为不同的经过身份验证的用户多次运行测试类的所有方法(数据在运行时拉出:来自数据库).所以我需要将数据传递给具有数据提供者的类,该数据提供者提供所有用户的凭据,然后为每个用户创建一个Web驱动程序(为了实验的纯度)并使用@BeforeClass方法中提供的凭据进行身份验证,运行所有@Test该类的方法,并@AfterClass拆除关闭web驱动程序.
我怎样才能做到这一点?
我尝试这样做的地方是:https: //gist.github.com/4246674
尝试1是@Test(dataProvider="getUsersIdAndName")上课.它不起作用,因为事实证明@Test(dataProvider=),类并不意味着应该使用提供的数据调用类的所有方法.结果是根本没有调用该方法,因为没有数据传递给它参数.我得到了奇怪的测试报告,其中此方法被标记为以0秒的执行时间通过.(这是在NetBeans中打开的Maven项目,如果这是有道理的.)
是否@Test(dataProvider=)在类指了什么呢?
Attempt2是@Test在方法的注释上添加dataProvider .它不起作用,因为这意味着在单个类运行期间调用测试方法两次.结果是,它第二次失败,因为它试图重复测试而web驱动程序没有重新初始化:浏览器已经呈现另一个页面.
第一次和第二次尝试的缺点是登录本身是在测试方法中完成而不是在@BeforeClass方法中,因为我知道无法用数据提供者的数据提供它.
尝试3是一个绝望的尝试结合@BeforeClass和@Test单一方法.它不起作用,因为如果带注释的方法有参数列表@BeforeClass也需要它@Parameters.结果是这个方法被调用了三次:由于上述原因,第一次作为类设置失败,而当成功时由于数据提供者而失败两次.
然后我发现TestNG没有提供一种方法来使用不同的数据多次调用所有类方法:http: //comments.gmane.org/gmane.comp.java.testng.user/864
我还有两个关于如何归档相同效果的想法.
Idea4是@Test(dataProvider=)在每个测试方法上放置一个,每个方法将自己执行身份验证和isAuthenticated()测试,然后执行它自己的测试.无效和丑陋.
Idea5看起来是最经济实惠的,@Test它只用一种方法来标记聚合所有其他测试方法:它从数据提供者接收数据,由给定用户执行身份验证,然后运行isAuthenticated测试和所有其他必要的测试.在这种情况下@BeforeClass,@AfterClass只是设置和拆除Web驱动程序.这种方法的缺点是我失去了使用的能力@BeforeMethod,@AfterMethod但这对我来说是负担得起的:看起来我不需要它们.
有没有更好的方法来存档相同的效果?
对不起,留言很长.
提前致谢.