我是自动化测试/ Java的新手,所以如果这是一个愚蠢的问题,请原谅我。
我的团队正在考虑使用Sauce Labs而不是本地网格配置来测试我们基于Web的应用程序。我成功地在Sauce的网站上https://docs.saucelabs.com/tutorials/java/#running-tests-in-parallel基于此代码并行运行测试,但我不喜欢必须在每个测试用例中指定要测试的浏览器的冗余。此外,示例代码仅适用于桌面配置,不适用于移动设备(仅声明操作系统,版本和浏览器)。
我修改了代码,因此它现在从Maven项目中的文本文件中读取名称/值对,并遍历每一行并将每个名称/值设置为一个功能。使用这种方法,我不必更新每个测试,因为WebDriver支持新的浏览器版本/设备。
在研究如何更改我的代码以简化我的测试套件时,我遇到了JUnit文档,该文档表明此方法正在创建依赖项http://junit.org/faq.html#organize_3。
我对人们对这种方法的看法感兴趣。从维护的角度来看,在测试用例中指定浏览器似乎是一场噩梦。有没有人有一个代码示例,说明他们如何设置他们的测试套件或资源,这将导致我朝着正确的方向前进?
我感谢任何意见!
代码示例:
@RunWith(ConcurrentParameterized.class)
public class NewTest implements SauceOnDemandSessionIdProvider {
private String capabilities, sessionId, jobID;
private WebDriver driver;
public SauceOnDemandAuthentication authentication = new SauceOnDemandAuthentication(CommonConstants.SAUCE_USERNAME, CommonConstants.SAUCE_ACCESS_KEY);
public NewTest(String capabilities){
this.capabilities = capabilities;
}
@ConcurrentParameterized.Parameters
public static LinkedList<String[]> browsersStrings() throws IOException {
LinkedList<String[]> capabilities = new LinkedList<String[]>();
//get file of desired capabilities.
File file = new File(CommonConstants.CAPABILITIES_TEXT_FILENAME);
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
//iterate through each line of the file and assign that line to an array
String line;
while((line = bufferedReader.readLine()) != null) {
capabilities.add(new String[] {line});
}
//close the file reader
bufferedReader.close();
//return the array to each parallel test to be used in the setup() function
return capabilities;
}
@Before
public void setUp() throws Exception {
DesiredCapabilities capability = new DesiredCapabilities();
String[] caps = capabilities.split(";");
int numberOfCapabilities = caps.length;
for(int i = 0; i < numberOfCapabilities; i++) {
String[] nameValues = caps[i].split(",");
String n = nameValues[0].toString();
String v = nameValues[1].toString();
capability.setCapability(n, v);
}
//use this to use Sauce Labs
this.driver = new RemoteWebDriver(new URL("http://" + authentication.getUsername() + ":" + authentication.getAccessKey() + "@ondemand.saucelabs.com:80/wd/hub"), capability);
//use this to use local configuration. Other portions of test case will also have to be commented out...
/*this.driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);*/
}
@Test
public void test() throws Exception {
driver.get("https://www.google.com/");
jobID = ((RemoteWebDriver) driver).getSessionId().toString();
updateSauceStatus(jobID);
}
@After
public void tearDown() throws Exception {
//TODO validate the driver is still active
driver.quit();
}
@Override
public String getSessionId() {
return sessionId;
}
public void updateSauceStatus (String jobID) {
SauceREST client = new SauceREST(authentication.getUsername(), authentication.getAccessKey());
Map<String, Object> updates = new HashMap<String, Object>();
//TODO
/*updates.put("name", "this job has a name");*/
updates.put("passed", true);
//TODO
/*updates.put("build", "1.0.2");*/
client.updateJobInfo(jobID, updates);
client.getJobInfo(jobID);
}
}
正如评论所指出的那样,仍有工作要做......
答案 0 :(得分:0)
我的组织平均每天在不同的浏览器上运行大约25K的测试。我们使用testNG而不是Junit来执行测试。这不应该有太大的不同。
正如您正确指出的那样,将浏览器维持在测试级别是一场噩梦。为了解决这个问题,我们根据功能对测试用例进行分组并运行整个组。 TestNG提供了一种对测试进行分组的方法。
我们在属性文件中指定组名称和浏览器名称。框架将读取此属性文件,并生成正确的驱动程序以进行测试。
要针对不同的浏览器运行相同的测试,我们在CI工具(Jenkins)中创建不同的测试版本。每个浏览器属性的设置都不同。