среда, 30 января 2013 г.

Thusidides Selenium

Thusidides Selenium

Расскажу про небольшой Framework на Selenium.
Наверное все таки большинство из нас пользуется Selenium WD и знает что наверное самое слабое место у него-это отчеты(вообще говоря их вообще нет),для репортинга в основном используются или плагины или отчеты с Junit или TestNG(если это Java).
Так вот Thsidides призван внести в разработку тестов не только некоторые улучшения,но самое главное хорошие отчеты.

Немного истории!(надо ж как то разнообразить рассказ)
Thusidides переводится как Фукиди́д,был древнегреческим историком,который прославился именно качественными репортами,отсюда и название этого фреймворка.
История закончилась,перейдем к делу.

Тесты набрасывались для примера и чтобы просто показать принцип,естественно они не поддерживаемые и все такое.

Для начала,чтобы подключить его к нашему проекту,добавим в Maven следующее:


  4.0.0

  webtests
  tests
  1.0-SNAPSHOT
  jar

  wikipediawebtests
  http://maven.apache.org

    
        UTF-8
        0.9.88
    

    
        
            junit
            junit
            4.8.2
        
        
            org.hamcrest
            hamcrest-all
            1.1
        
        
            net.thucydides
            thucydides-junit
            ${thucydides.version}
        
        
            org.slf4j
            slf4j-simple
            1.6.1
            pom
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.2
                
                    1.5
                    1.5
                
            
            
                net.thucydides.maven.plugins
                maven-thucydides-plugin
                ${thucydides.version}
            
        
    
                      

Все после добавления в проект,начнем разбираться как он нам предлагает структурировать наши тесты.
Вообще он больше рассчитан на приемочные тесты.Вы это сами заметите.
Создается общий класс для требований,фич и.т.д.


public class Application {
    @Feature
        public class TestPageBook {}
        public class TestAuth{}
        public class TestSearch{}
}
Как мы видим,в одной фиче может быть несколько классов и конечно может быть несколько фич.
После этого создается класс с  тестом

@RunWith(ThucydidesRunner.class)
@Story(Application.TestPageBook.class)
public class TestPageBook {

    @Managed
    public WebDriver driver;

    @ManagedPages(defaultUrl = "http://m.megafonpro.ru/")
    public Pages pages;

    @Steps
    public StepsinBook book;

    @Test
    public void testBook() throws Exception {
        book.getMain("http://m.megafonpro.ru/");   //Вход на главную страницу тестируемого ресурса
        book.AllBooks();                                                //Переход во вкладку Все книги      
        book.search();                                                 //Поиск книги с поисковым выражением "Книга
        book.catalog();                                                 //Проверка каталога книг по жанрам

    }
    @Pending @Test              //данная аннотация значит,что тест еще не имплементирован
    public void testBuyBook(){}

}

Далее описываются шаги самого теста,Steps как они называются здесь.

public class StepsinBook extends ScenarioSteps {
    public StepsinBook(Pages pages) {
        super(pages);
    }
    public BookPage getPageBook()
    {
        return  getPages().currentPageAt(BookPage.class);
    }

    @Step
    public void getMain(String url)
    {
        getPageBook().getMainPage(url);
    }

    @Step
    public void AllBooks()
    {
        getPageBook().allBooks();
    }

    @Step
    public void search(){
        getPageBook().search("Книга");
    }

    @Step
    public void catalog(){
        getPageBook().catalog();
    }
}

И привычная нам работа с WD с PageObject.

package Actions;
public class BookPage extends PageObject {
    private ShareFunc func;
    @FindBy(linkText = "Все книги")
    WebElement allbooksButton;

    @FindBy(linkText = "Поиск")
    WebElement searchButton;

    @FindBy(name = "query")
    WebElement searchField;

    @FindBy(css = "button")
    WebElement searchBegin;
    @FindBy(linkText = "Большая книга кремлевских тайн.")
    WebElement searchBook;

    @FindBy(linkText = "Каталог")
    WebElement catalog;

    @FindBy(linkText = "Малая форма")
    WebElement littleForm;

    @FindBy(linkText = "Повести")
    WebElement story;

    @FindBy(linkText = "Всего лишь капелька яда")
    WebElement oneOfStories;

    public BookPage(WebDriver driver) {
        super(driver);
        func=new ShareFunc(driver);

    }

    public void getMainPage(String url) {
        getDriver().get(url);

    }

    public void allBooks() {

        func.safeClick(allbooksButton);

    }

    public void search(String searchWord) {
        func.safeClick(searchButton);
        func.sendKeys(searchField, searchWord);
        func.safeClick(searchBegin);
        func.safeClick(searchBook);

    }

    public void catalog() {
        func.safeClick(catalog,getDriver());
        assertEquals("КАТАЛОГ",findElement(By.cssSelector("div.title > strong")).getText());
        func.safeClick(littleForm);
        assertEquals("МАЛАЯ ФОРМА",findElement(By.cssSelector("div.title > strong")).getText());
        func.safeClick(story, getDriver());
        assertEquals("МАЛАЯ ФОРМА - ПОВЕСТИ",findElement(By.cssSelector("div.title > strong")).getText());
        func.safeClick(oneOfStories);
        assertTrue(getPageSource().contains("Марина Серова"));
    }
}

Иерархия тестов примерно такая,сначала мне не понравилась,но если с ней поработать,то весьма удобно.
Далее в запускаем через maven
mvn test thucydides:aggregate
 
И он нам забацает вот такой отчет.




Немного о более тонкой настройке:
Для выбора запуска браузера запускаем Maven с опцией:
-Dwebdriver.driver=chrome
А для параллельного запсука тестов например используем сигнатуры перед классом с тестами
@RunWith(ThucydidesParameterizedRunner.class)
@Concurrent(threads="3")
 

3 комментария:

  1. команда "R" благодарна тебе!

    ОтветитьУдалить
  2. а есть какой-нибудь archetype для сусидис+вебдрайвер? чтобюы получилась структура с примерами? )

    ОтветитьУдалить
  3. Конечно есть.
    Есть 2 для easyb и junit
    Например вот так это выглядит:
    net.thusidides:thusidides-simple-archetype
    или
    net.thusidides:thusidides-easyb-archetype

    ОтветитьУдалить