2017-01-13 1 views
1

было время, так как я был здесь, и просто пытаюсь переосмыслить себя с моей системой автоматизации тестирования, над которой я работаю. Может быть, глупый вопрос, но я все равно его выброшу, как я думаю вслух.Тесты очень долгое с конфигурациями Selenium

Поскольку я представил конфигурационный файл, содержащий путь к файлу excel (который содержит тестовые данные), и реализовал базовый считыватель excel для извлечения этих данных для тестирования, я нахожу, что большая часть моего первоначального теста в первую очередь все это настроено.

Например:

  1. создать экземпляр класса ReadPropertyFile
  2. Создать объект класса ExcellDataConfig и передать ему местоположение файла первенствовать из конфигурационного файла
  3. установить TestCase id для этого теста для сканирования файла excel для начала считывания данных с листа. Лист excel содержит маркеры.
  4. . .
  5. . Получите информацию о роли rol/col с листа всех интересных вещей, которые мне нужны для моего теста. Например, имя пользователя/пароль или некоторые другие данные
  6. открыть браузер
  7. в случае запуска теста для нескольких пользователей настроил цикл цикла, который выполняет итерацию через лист Excel и регистрируется, а затем выполняет фактический тест.

Есть много вариантов конфигурации, но есть ли более простой способ?

У меня есть отдельный класс TestBase, который содержит класс входа в систему, и я подумал, что кто-то переместит этот материал для входа в систему, но не уверен, что это такая хорошая идея.

Я просто не хочу, чтобы увязнуть в дублирующей работе, есть ли у кого-нибудь предложения высокого уровня?

+0

Действительно ли вам необходимо использовать Excel? Я сохраняю свои тестовые данные в свойствах Java (для простого хранения) или в формате Json (для более сложных данных). Он загружается очень быстро и хорошо интегрируется с любой IDE, которую я знаю. Для входа в систему: в большинстве случаев полезно ввести код входа/выхода из системы в метод setup/teardown (используйте @Before, @After) базового класса, поэтому любой производный класс будет использовать его автоматически. –

+0

Спасибо @ Würgspaß Я рассмотрю ваше предложение для файла JSON. – tarquin

+0

Хорошо, я добавил пример кода, поэтому надеюсь, что вы получите идею ... –

ответ

1

Вот компилятивный (но не полностью закодированный) быстрый и грязный пример того, как вы могли бы создать базовый класс для классов тестов Selenium.

Базовый класс определяет метод входа/выхода из системы, который будет вызываться до/после тестирования производных тестовых классов.

Данные считываются из файла Json (на основе javax.json) и используются для определения местоположения элементов (с помощью клавиш) для и ввода данных (с использованием значений). Вы можете легко расширить код для поддержки обработки других элементов или стратегий местоположения (css, xpath).

Обратите внимание, что этот пример не оптимизирован для производительности. Но это достаточно быстро для начала, и вы можете адаптировать его к вашим потребностям (например, загружать загружаемые данные в статическом контексте).

package myproject; 

import java.io.*; 
import java.util.*; 

import javax.json.Json; 
import javax.json.stream.JsonParser; 
import javax.json.stream.JsonParser.Event; 

import org.junit.*; 
import org.openqa.selenium.*; 
import org.openqa.selenium.support.ui.*; 

public class MyProjectBaseTest {  
    protected static WebDriver driver; 

    @Before 
    public void before() { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://myapp"); 
     login(); 
    } 

    @After 
    public void after() { 
     logout(); 
    } 

    private void login() { 
     Map<String, String> data = readData("/path/to/testdata/login.json"); 

     Set<String> keys = data.keySet(); 
     for (String key : keys) { 
      WebDriverWait wait = new WebDriverWait(driver, 20L); 
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(key))); 
      final WebElement we = driver.findElement(By.id(key)); 
      if ("input".equals(we.getTagName())) { 
       we.clear(); 
       we.sendKeys(data.get(key)); 
      } 
      //else if "button".equals(we.getTagName()) 
     } 
    } 

    private void logout() { 
     //logout code ... 
    } 

    private Map<String, String> readData(String filename) { 
     Map<String, String> data = new HashMap<String, String>(); 

     InputStream is = null; 
     String key = null;   
     try { 
      is = new FileInputStream(filename); 
      JsonParser parser = Json.createParser(is); 
      while (parser.hasNext()) { 
       Event e = parser.next(); 
       if (e == Event.KEY_NAME) { 
        key = parser.getString(); 
       } 
       if (e == Event.VALUE_STRING) { 
        data.put(key, parser.getString()); 
       } 
      } 
      parser.close(); 
     } 
     catch (IOException e) { 
      //error handling 
     } 
     finally { 
      //close is 
     } 

     return data; 
    } 

} 
1

Все это «работа установки», вы описали на самом деле является довольно распространенным материал, и это как AAA pattern действительно работает:

шаблон для размещения и форматирования кода в методах UnitTest

Для продвинутых Fixture использование вы могли бы использовать наиболее подходящий для вашего случая xUnit Setup pattern.

Я полностью согласен с комментарием @ Würgspaß. То, что он описывает, называется Object Map, и я использовал его в течение последних 3 лет с большим успехом в нескольких проектах автоматизации.

Я не вижу в вашем сценарии какого-либо использования конкретной структуры, поэтому я бы предложил, чтобы вы выбрали какой-то зрелый, например TestNG в сочетании с Cucumber JVM. Последний из них предоставит Context injection, поэтому вы можете всегда получать объекты четкого определения шага, которые могут использовать контекст/состояние во время запуска сценария. И вы сможете повторно использовать все тяжелые настройки только один раз и поделиться им между всеми тестами. I/O являются дорогостоящими и могут вызывать проблемы в более сложных случаях, например. параллельное выполнение ваших тестов.

Что касается дизайна вашего кода, вы можете найти некоторые из Selenium's Test design considerations очень полезными, например CallWrappers.

+0

Спасибо за предоставление отличных ссылок и предложений @ekostadinov. Я попытаюсь выяснить, как улучшить на основе материалов, которые вы предоставили. – tarquin

+0

@ tarquin, пожалуйста, удалите комментарий «Спасибо». У StackOverflow есть четкая политика голосования хороших и полезных ответов, вы также можете отметить мое как «Принято». Это поможет нам сохранить ваш вопрос в чистоте :) – ekostadinov