2015-04-20 3 views
1

Я новичок в автоматическом тестировании/Java, поэтому, пожалуйста, простите меня, если это глупый вопрос.Параллельная проверка/разборка одного теста на набор тестов? Организация тестирования

Моя команда рассматривает возможность использования Sauce Labs вместо локальной конфигурации Grid для тестирования наших веб-приложений. Мне удалось получить тесты для параллельного запуска на основе этого кода на веб-сайте 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

Моя организация работает около 25K тестов в среднем каждый день на разных браузерах. Мы используем testNG вместо Junit для выполнения теста. Это не должно иметь большого значения.

Как вы правильно указали, поддержание браузера на тестовом уровне - это кошмар. Чтобы преодолеть это, мы группируем тестовые примеры на основе функциональности и запускаем всю группу. TestNG предоставляет метод для группировки тестов.

Мы указываем имя группы и имя браузера в файле свойств. Этот файл свойств будет считаться каркасом, и он породит правильный драйвер для теста.

Чтобы выполнить те же тесты для разных браузеров, мы создаем различные тестовые сборки в инструменте CI (Jenkins). Каждое свойство браузера будет установлено по-разному.