每个测试套件一次并行测试设置/拆卸?测试组织

时间:2015-04-20 20:27:45

标签: java selenium junit selenium-grid saucelabs

我是自动化测试/ 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);

   }


}

正如评论所指出的那样,仍有工作要做......

1 个答案:

答案 0 :(得分:0)

我的组织平均每天在不同的浏览器上运行大约25K的测试。我们使用testNG而不是Junit来执行测试。这不应该有太大的不同。

正如您正确指出的那样,将浏览器维持在测试级别是一场噩梦。为了解决这个问题,我们根据功能对测试用例进行分组并运行整个组。 TestNG提供了一种对测试进行分组的方法。

我们在属性文件中指定组名称和浏览器名称。框架将读取此属性文件,并生成正确的驱动程序以进行测试。

要针对不同的浏览器运行相同的测试,我们在CI工具(Jenkins)中创建不同的测试版本。每个浏览器属性的设置都不同。