Всем привет.
Наверное каждый QA инженер сталкивался с проблемой автоматизации флеша. Когда я слышу эту тему, в голове возникают термины - Eggplant, Sikuli, Selenium-flash... И никакого позитива :)
Недавно мне встретилась статья об Automated UI Tester for Adobe ActionScript или если кратко - Genie. Как понятно из названия – это инструмент тестирования флеш - приложений. Его легко установить, он бесплатный и довольно удобный. Если честно, то я не планировал писать ознакомительную статью, но я думаю, что инструмент достоин внимания.
Если вы заинтересовались тогда, пожалуйста, почитайте вот эти замечательные статьи:
Или, для отчаянных - мануал.
Там вы найдёте плюсы продукта, его установку и азы работы. Всё очень понятно и доступно.
Мне бы хотелось пойти чуть дальше и описать простой пример интеграции Genie с Selenium Webdriver и TestNg. Писать всё будем, конечно, на Java.
Мы прочитали мануал, статьи и теперь знаем, как запустить отдельный скрипт Genie. Но давайте представим, что мы тестируем онлайн-игру. Или несколько игр. Нам бы хотелось сначала открыть страницу с игрой, прокрутить Genie-скрипт, а потом как-то посмотреть, что флешка корректно взаимодействует со страницей. Тогда хорошо бы и Genie сервер запускать и останавливать автоматически. Да и вообще неплохо бы обернуть всё нами написанное в тесты под какими-нибудь jUnit или TestNG.
Давайте попробуем.
1. Автоматический запуск и остановка Genie сервера.
Давайте изначально условимся, что наш проект лежит по вот такому пути: C:\Projects\Java\GenieTestNG. Для запуска сервера можно пойти самым простым путём – добавить в проект командный файлик runServer.bat. Он будет запускать файл GenieSocketServer.jar, который, в свою очередь, входит в пакет файлов Genie и лежит по адресу C:\Libs\Genie\GenieServer\GenieSocketServer.jar. Потому наш командный файл будет выглядеть так:
cd C:\Libs\Genie\GenieServer\
start "GenieServer" java -Dfile.encoding=UTF-8 -Xms512M -Xmx512M -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -jar GenieSocketServer.jar
Поступим точно также и с остановкой сервера. Напишем командный файлик stopServer.bat:
taskkill /FI "WINDOWTITLE eq GenieServer"
А теперь сделаем методы запуска и остановки:
private void startGenieServer() {
ExecuteBatch("cmd /c start runServer.bat");
}
private void stopGenieServer() {
ExecuteBatch("cmd /c start stopServer.bat");
}
private void ExecuteBatch(String command){
try {
Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
}
}
2. Запуск Genie скриптов.
Вариант запуска скриптов, предложенный в мануале, нас не вполне устраивает. Нам не нужна отдельная конфигурация запуска под каждый Genie-скрипт. Нужно чтобы мы могли запускать любой скрипт, внутри тестов, передавая путь к скрипту, как параметр. Давайте создадим класс GenieScriptsExecutor и в нём метод ExecuteScript:
public class GenieScriptsExecutor {
public static void ExecuteScript(String path) {
try {
String[] path_arr = new String[]{path};
Executor.startExecution(path_arr);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Я умолчал, что предварительно, нужно было добавить файл Executor.jar в Buildpath нашего проекта. Этот файлик находится среди других файлов пакета Genie: Genie-binary\Genie\GenieScripts\Executor.jar.
Вернёмся к коду. Команда выполнения скрипта будет теперь выглядеть так:
GenieScriptsExecutor.ExecuteScript("Path to GenieScript.class");
3. Связка с Webdriver.
Мы уже умеем выполнять нужные нам скрипты внутри кода. Можно оборачивать их в любую нужную нам логику. Например - в тесте нужно открыть страницу с игрой, сделать несколько действий во флешке, затем проверить, что на странице появился нужный нам элемент с локатором id=“gameEnd”. Тестовый метод будет выглядеть так:
public void testGame(){
openUrl("http://testsite/gamepage/");
GenieScriptsExecutor.ExecuteScript("C:\\Projects\\Java\\GenieTestNG\\bin\\genieScripts\\GenieScript.class");
waitforElementPresent(By.id("gameEnd"));
}
private void openUrl(String testUrl){
driver.get(testUrl);
}
private void waitforElementPresent(By locator) {
try{
for (int second = 0; second<10; second++) {
if (driver.findElements(locator).size()>0){
return ;
}
Thread.sleep(1000);
}
}
catch (Exception e) {e.printStackTrace();}
}
4. Связка с TestNG.
Нам остаётся совсем немного. Обернём нашу логику в тесты под testNG. Для этого добавим к тестовому методу аннотацию @Test:
@Test
public void testGame(){
openUrl("http://testsite/gamepage/");
GenieScriptsExecutor.ExecuteScript("C:\\Projects\\Java\\GenieTestNG\\bin\\genieScripts\\GenieScript.class");
waitforElementPresent (By.id("gameEnd"));
}
Запуск Genie-сервера и вебдрайвера вынесем в отдельный метод и будем запускать их перед всеми тестами. Для этого создадим метод Setup и пометим его аннотацией @BeforeTest:
public WebDriver driver;
@BeforeTest
public void Setup(){
startGenieServer();
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
Остановку вебдрайвера и Genie сервера также вынесем в отдельный метод. Назовём его TearDown и пометим аннотацией @AfterTest, чтобы выполнять после прохождения всех тестов.
@AfterTest
public void TearDown(){
stopGenieServer();
driver.close();
driver.quit();
}
Напомню, что методы startGenieServer() и stopGenieServer() мы создали в первой части статьи.
На этом всё. Пример прост, без использования каких-либо паттернов проектирования или хитростей, но я надеюсь, что так получилось доступнее.
Спасибо.