TestNG
Настройка Continuous Integration при использовании TestNG, Jenkins, Eclipse, Ant и тестов написанных на selenium-webdriver
Опубликовано saddy666@gmail.com в 11.11.2011Подскажите что нужно поставить и где можно настроить Jenkins
Ant + Jenkins
Опубликовано Shaman в 04.11.2011есть набор тестов, есть ант, есть дженкинс. нужно запукать тесты через дженкинс при помощи анта. но не выходит. через консоль тесты запустить могу, а вот при запуске через дженкинс пишет следующее
Started by user anonymous [TestTesttest] $ cmd.exe /C '"ant.bat -file build.xml test && exit %%ERRORLEVEL%%"' "ant.bat" Ґ пў«пҐвбп ўгв॥© Ё«Ё ўҐиҐ© Є®¬ ¤®©, ЁбЇ®«пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐвл¬ д ©«®¬. Build step 'Вызвать Ant' marked build as failure Finished: FAILURE
Проводим тесты JUnit параллельно
Опубликовано polusok в 08.07.2011Если вы используете тесты Selenium или другие тесты на основе JUnit, для проведения которых необходим длительный период времени и немного ресурсов ЦП, однажды вы захотите сделать так, чтобы их можно было проводить одновременно. Хорошая новость в том, что это очень просто сделать, используя Apache Ant.
Именно поэтому меня очень удивляет то, что еще никто этого не делает. Большинство людей пытаются изобретать колесо и пробуют использовать другие фреймворки, например TestNG, пишут новые экспериментальные компьютерные классы для JUnit, или даже конфигурируемые версии этих классов. Все это – пустая трата времени для тех, кто просто хочет проводить несколько тестов сразу.
Вот как это можно сделать:
»
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Читать далее
Selenium RC (Java): Шаги усовершенствования тестов. Часть 2
Опубликовано KaNoN в 16.07.2010Часть 1
В предыдуших шагах мы позаботились, пожалуй о самой чувствительной к изменениям части - идентификаторах объектов. Но этого еще недостаточно, есть еще несколько шагов, которые нужно сделать, чтобы минимизировать затраты на поддержку, а также время на разработку, да и просто сделать тесты более понятными и удобными для чтения. Итак, рассмотрим эти шаги.
Шаг 4: Абстрагируемся до уровня действий на странице
В предыдущем шаге мы сумели вынести локаторы в отдельный файл и, задав, понятные имена, мы можем уже проследить, над какими элементами проводятся операции. Тем не менее, мы по-прежнему работаем на уровне примитивных команд, которые мало к чему привязаны. К тому же слабо прослеживается переход с одной страницы на другую.
Другой момент заключается в том, что держать в голове все псевдонимы всех элементов неудобно, особенно для больших объемов тестов. То есть надо бы как-то сделать так, чтобы и псевдонимы элементов использовались не так интенсивно. Да и хотелось бы, чтобы тестовые инструкции выглядели более информативно, например, не
selenium.clickAndWait( "leftpanel.newjob" );
а что-то наподобие
mainPage.clickOnNewJobLink();
То есть примитивные операции обернуть в некоторый функционал, который уже отражал бы смысл операции. Это так называемый PageObject-подход, при котором некоторому отдельному окну/странице/форме соответствует некоторый класс, методы которого соответствуют либо каким-то дочерним элементам, либо примитивным действиям внутри данного окна/страницы/формы. Один из примеров подобной реализации можно описан здесь: http://autotestgroup.com/ru/blog/55.html, а точнее реализация подобного для TestComplete. Там было описано, как обернуть некоторые дочерние элементы. В нашем случае применим подход обертки действий над некоторыми элементами, так как Selenium больше ориентирован на действия, которые проводятся над объектом, а не на объекты, над которыми проводятся действия. Это достаточно тонкая грань, которую надо уметь усмотреть.
В любом случае, нам нужен некоторый набор классов, которые могли бы соответствовать некоторым страницам. Сразу следует обратить внимание на то, что если мы скрываем действия Selenium-а внутри некоторого внешнего класса, то нам надо в этот класс передать объект Selenium-а, созданный тестом. Например, при создании любого объекта страницы в качестве параметра передается объект Selenium-a. Пожалуй, это будет наиболее общее для всех объектов страниц решение. В пакет com.mycompany.selenium.lib добавим класс BaseTestClass со следующим содержимым:
/**
*
*/
package com.mycompany.selenium.lib;
/**
* @author KaNoN
*
*/
public class PageObjectClass {
protected ExtendedSelenium selenium = null;
public PageObjectClass( ExtendedSelenium selenium ) throws Exception {
this.selenium = selenium;
}
}
После этого, мы можем создавать классы страниц, которые (классы) будут отнаследованы от данного класса. Еще один момент. Когда мы работаем с объектом страницы, то в ряде случаев, когда мы делаем действие, приводящее к переходу на новую страницу, было бы полезно возвращать объект этой новой страницы. Учитывая эти пожелания, создадим отдельный пакет для классов страниц. Назовем его “com.mycompany.selenium.lib.pages” и добавим в него 3 класса страниц, с которыми работает наш тест:
MainPage:
/**
*
*/
package com.mycompany.selenium.lib.pages;
import com.mycompany.selenium.lib.ExtendedSelenium;
import com.mycompany.selenium.lib.PageObjectClass;
/**
* @author KaNoN
*
*/
public class MainPage extends PageObjectClass {
/**
* @param selenium
* @throws Exception
*/
public MainPage(ExtendedSelenium selenium) throws Exception {
super(selenium);
}
public NewJobPage clickOnNewJobLink() throws Exception{
selenium.clickAndWait( "leftpanel.newjob" );
return new NewJobPage( selenium );
}
public MainPage clickOnHudsonLink() throws Exception {
selenium.clickAndWait("leftpanel.hudson");
return this;
}
}
NewJobPage:
/**
*
*/
package com.mycompany.selenium.lib.pages;
import com.mycompany.selenium.lib.ExtendedSelenium;
import com.mycompany.selenium.lib.PageObjectClass;
/**
* @author KaNoN
*
*/
public class NewJobPage extends PageObjectClass {
/**
* @param selenium
* @throws Exception
*/
public NewJobPage(ExtendedSelenium selenium) throws Exception {
super(selenium);
}
public NewJobPage typeJobName( String name ) throws Exception {
selenium.type( "newjobpage.name", name );
return this;
}
public NewJobPage checkFreeStyleJobRadioButton() throws Exception {
selenium.click("newjobpage.freestyleradio");
return this;
}
public ConfigureJobPage clickOK() throws Exception{
selenium.clickAndWait("newjobpage.ok");
return new ConfigureJobPage( selenium );
}
}
ConfigureJobPage:
/**
*
*/
package com.mycompany.selenium.lib.pages;
import com.mycompany.selenium.lib.ExtendedSelenium;
import com.mycompany.selenium.lib.PageObjectClass;
/**
* @author KaNoN
*
*/
public class ConfigureJobPage extends PageObjectClass {
/**
* @param selenium
* @throws Exception
*/
public ConfigureJobPage(ExtendedSelenium selenium) throws Exception {
super(selenium);
}
public MainPage clickSave() throws Exception {
selenium.clickAndWait("configurejob.save");
return new MainPage( selenium );
}
}
Если посмотреть внимательно, то можно увидеть, что каждое действие, которое возвращает объект страницы, либо создает новый объект, либо возвращает указатель на себя, если перехода на новую страницу не было.
Selenium RC (Java): Шаги усовершенствования тестов. Часть 1
Опубликовано KaNoN в 16.07.2010Часть 2
Миф о том, что для автоматизированного тестирования не нужны навыки программирования и тесты можно вполне легко записывать, развенчан настолько, что сам факт того, что кто-то еще так считает, уже кажется мифом или, как минимум, чем-то странным. Понятное дело, что записанные тесты и тесты, которые могли бы эффективно использоваться на регулярной основе – это, как говорят в Одессе, «две большие разницы». Очевидно, что исходный тест, да и решение по автоматизации в целом, должны пройти некоторые стадии улучшения, прежде чем прийти к пригодному к использованию виду. Давайте рассмотрим некоторые типовые шаги, которые так или иначе приходится проходить для построения стабильного, расширяемого и поддерживаемого решения.
И рассмотрим мы эти шаги на примере Selenium-RC (Java). На самом деле, данная тематика не сильно завязана на конкретный инструментарий. Всё то же самое можно сделать практически любым средством, которое в себе содержит возможность программирования тестов. Просто чтобы не уходить в абстрактную теорию, а показать на конкретных примерах, как оно работает, нужно привязаться к какой-то конкретно реализации. Но подобные практики имеют место быть в любых аналогичных решениях. Поэтому, тут можно усматривать не только особенность работы с каким-то конкретным средством, но и стоит обратить внимание на практики в целом, которые будут задействованы.
Итак, путем записи и незначительной корректировки был получен следующий тест:
package com.mycompany.selenium.tests;
import java.util.Date;
import com.thoughtworks.selenium.*;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author KaNoN
*/
public class SampleTestStage00 {
private Selenium selenium = null;
private String genTaskName() {
Date dt = new Date();
String result = dt.toString();
result = result.replaceAll( ":" , "" );
result = result.replaceAll( " " , "" );
return result;
}
@BeforeMethod(alwaysRun=true)
public void init() throws Exception {
selenium = new DefaultSelenium( "localhost" , 4444 , "*iexplore" , "http:// localhost:8080" );
selenium.start();
selenium.open("http://localhost:8080/hudson");
}
@Test(groups = {"sample","sample0"})
public void testCreateJob() throws Exception {
selenium.click("link=New Job");
selenium.waitForPageToLoad("30000");
selenium.type("name", "SampleTask" + genTaskName() );
selenium.click("//input[@value='Build a free-style software project']");
selenium.click("//button[@type='button']");
selenium.waitForPageToLoad("30000");
selenium.click("//button[text()='Save']");
selenium.waitForPageToLoad("30000");
selenium.click("link=Hudson");
selenium.waitForPageToLoad("30000");
}
@AfterMethod(alwaysRun=true)
public void stop() throws Exception {
selenium.stop();
}
}Что он делает? Он запускает веб-приложение (в данном примере это Hudson) и создает в нем новую задачу. Тест реализован с использованием TestNG в качестве тестового движка.
Как видно, тест еще далек от совершенства, как минимум из-за того, что много hard-coded значений. Да и вот так на первый взгляд трудно понять, что этот тест детает вообще. В-общем, непонятных вещей много, нужно усовершенствовать. Вопрос в том, что, когда и (самое главное) как.
»
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Читать далее








