Бодрящий микс из Selenium и TestNG Регрессионное тестирование руками разработчиков Ребров Андрей Luxoft.

Презентация:



Advertisements
Похожие презентации
Test 14 Вопрос 1. class Main { public void method() { static class One { public One() { System.out.println("From one"); } } public static void main(String...
Advertisements

Test 17 Вопрос 1. public class TKO { public static void main(String[] args) { String s = "-"; Integer x = 343; long L343 = 343L; if (x.equals(L343)) s.
PHP&Flex - новая альтернатива для создания RIAs Иванников Андрей Улич Дмитрий.
Test 5 Вопрос 1. В результате компиляции каких строк будет происходить ошибка компиляции: public class Main { public static void main(String[] args) {
Work with databases in Java. JDBC Tutorial for students of universities Author: Dudnik Oxana.
Test 9 Вопрос 1. public class A { private String runNow() { return "High"; } static class B extends A { public String runNow() { return "Low"; } } public.
Test 10 Вопрос 1. public class Test implements Iterator { // 1 private List list = new ArrayList (); // 2 public void addList(T... ts) { Collections.addAll(list,
Test15 Вопрос 1. class AClass { } public class Test { public static void main (String... args) { ArrayList a = new ArrayList (); AClass aaaClass = new.
Test 3 Вопрос 1. 01:package test; 02: public class Test { 03: public static void main(String [] args) { 04: Test test = new Test(); 05: System.out.println(test.toString());}
Test 8 Вопрос 1. class Class1 { Class1(int i) { System.out.println("Class1(int)"); } public class Class2 extends Class1 { Class2(double d) { // 1 this((int)
Язык программирования Java Дмитриев Андрей Владиславович Май 2007.
Java Server Pages(JSP). JavaServer Pages (JSP) позволяют вам отделить динамическую часть ваших страниц от статического HTML. Вы, как обычно, пишете обычный.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(two"); lst.add(three");
1 © Luxoft Training 2012 Inner and anonymous classes.
Test 16 Вопрос 1. class Clazz { { System.out.println("non-static init"); } public static void main(String a[]) { System.out.println("main"); Clazz ob1.
Абстрактные типы данных 1. Абстрактная дата Date dt1, dt2; dt1 = new Date(1, Date.MARCH, 2006); dt2 = (Date)dt1.clone(); dt2.add(300); //
Стеки и очереди 1. Абстрактный стек public interface Stack { static class Underflow extends Exception { public Underflow() { super("Stack underflow");
Шаблоны проектирования ООП. Принципы ООП Инкапсуляция Наследование Полиморфизм Абстракция данных.
Параллельная работа сокетов в C#. Потоки в C# using System; using System.Threading; public class ThreadExample { public static void ThreadProc() { for.
Hibernate&EJB3 Studybook For students of university Author Sr.Java developer Dudnik Oxana.
Транксрипт:

Бодрящий микс из Selenium и TestNG Регрессионное тестирование руками разработчиков Ребров Андрей Luxoft

@andrebrov

Сколько тестировщиков в вашей команде?

Всегда кажется, что их не хватает

При этом... «У нас agile» - значит, тестирование должно завершиться в том же спринте «Люблю короткие релизы»- значит регрессионное тестирование надо делать постоянно «Они опять изменили требования!» - значит опять надо менять тесты

Хватит это терпеть!

Задачи Нужно иметь возможность проводить регрессию в короткий период времени Тесты должны быть простыми, чтобы их можно было легко написать/дописать/переписать Поддержка тестов не должна занимать много времени

Необходимые инструменты Тестовый фреймворк Фреймворк функционального тестирования CI Server + удобная IDE, понятный генератор отчетов, удобный язык программирования...

Что взяли мы TestNG Selenium 2 / WebDriver Spring IntelliJ IDEA Jenkins Набор самописных утилит

Почему TestNG Удобная работа с данными Разбиение тестов по группам Многопоточность «из коробки» «Фабрика» тестов

Почему WebDriver Java-фреймворк Абстракция на уровне PageObject Работа с IE & FF Активно развивается

Зачем Spring? Облегчение работы с базами данных Необходима интеграция с различными сервисами в рамках тестов IoC

Этапы создания тестовой платформы

Создание базового тестового класса public abstract class AbstractSeleniumTestClass extends AbstractTestNGSpringContextTests private WebDriver = true) public void printTestName(Method method) { = true) public void clearCookies(Method method) throws Exception { } protected WebDriver getWebDriver() { } public SearchPage loadLemAndLogin() { }

Создание базовой web- страницы public abstract class AbstractPage extends LoadableComponent { public AbstractPage(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, DEFAULT_TIMEOUT); PageFactory.initElements(driver, this); } protected abstract By getPageLoadedCheckElementLocator(); // Primitive actions protected void clickOn(WebElement webElement) { } protected void type(WebElement webElement, String text) { } // Keys protected void pressEnter(WebElement webElement) { } protected void pressRight(WebElement webElement) { } // Autocomplete public void fillAutocomplete(WebElement webElement, String text) { } // Waits public WebElement waitUntilFound(final By by) { }

Описание web-страницы dfpublic class LoginPage extends AbstractPage { private static final Logger log = = private WebElement = private WebElement = private WebElement loginButton; public LoginPage(WebDriver driver) { super(driver); protected By getPageLoadedCheckElementLocator() { protected void isLoaded() throws Error { } public SearchPage login() { }

Вынесение данных в DataProvider public class SearchDataProvider public static Object[][] searchTypes() { Object[][] result = new Object[4][1]; result[0][0] = "BEGINS_WITH"; result[1][0] = "CONTAINS"; result[2][0] = "CONTAINS_SUBSTRING"; result[3][0] = "SOUNDS_LIKE"; return result; }

Refactoring Вынесение текстовых констант из классов страниц Группировка DataProvider`ов в классы

Подключение базы данных

Работа с базой внутри public class SearchByAlternateNameDataProvider { private static DataProviderGenerator public void setDataProviderGenerator(DataProviderGenerator dataProviderGenerator) { SearchByAlternateNameDataProvider.dataProviderGenerator = dataProviderGenerator; public static Object[][] alternateNameAndNonSuitableCOI() { return dataProviderGenerator.generatePairStringString("select … + Config.DATA_COUNT); public class DataProviderGenerator private TestingJdbcTemplate testingJdbcTemplate; public Object[][] generatePairStringString(String sql) { List list = testingJdbcTemplate.getSimpleJdbcTemplate().query(sql, new PairRowMapper()); Object[][] result = new Object[list.size()][2]; int i = 0; for (Pair pair : list) { result[i][0] = pair.getOne().toString(); result[i++][1] = pair.getTwo().toString(); } return result; }

Хинт 1 – WebDriver как public class SeleniumConfiguration private WebDriver driver; WebDriver driver() { public void cleanUp() { try { driver.quit(); } catch (Throwable e) { e.printStackTrace(); }

Хинт 2 – TestFactory для похожих тестов public class SearchTestFactory = "searchTypes", dataProviderClass = SearchDataProvider.class) public Object[] createTest(String searchType) { return new Object[]{new GenericSearchTest(searchType)}; } public class GenericSearchTest extends AbstractSeleniumTest { private String searchType; public GenericSearchByLegalNameCOITest(String searchType) { this.searchType = searchType; = "legalNamesAndCountries", dataProviderClass = = SRC-19") public void test(String param1, String param2) { }

Хинт 3 – Unit-тест как тест-кейс SearchPage searchPage = loadAndLogin(); searchPage.setLegalNameSearchType(searchType); searchPage.setLegalNameSearchParam(legalName); SearchResultPage searchResultPage = searchPage.submit(); assertIsSortedByLegalName(searchResultPage);

Хинт 4 – Подключаем javascript public void waitForAjaxComplete() { log.verbose("waiting for ajax completion"); wait.until(new ExpectedCondition () { public Boolean apply(WebDriver driver) { return (Boolean) js.executeScript("return $.active == 0"); } }); log.verbose("All ajax calls are complete"); }

Подключаем Jenkins Используем возможность запуска через maven Подключаем отчеты от TestNG и видим результаты регрессии Запуск тестов по расписанию / установке новой версии / …

Profit!

Куда двигаться дальше Создание профилей тестирования (smokem full, search) Selenium Grid и многопоточность 1 подход – разные типы приложений (WebService, ETL,...) End-to-end тестирование

Андрей