Тестирование Automation Framework для веб-приложения с использованием Java
Я начинаю писать Test Automation Framework на Java (язык, который мне удобен) для моего веб-приложения. В настоящее время он полностью протестирован на пользовательском интерфейсе. Нет бэкэнда / API-тестирования в поле зрения.
Я планирую использовать Selenium Web Driver. Эта структура будет поддерживать функциональное / интеграционное и тестирование производительности.
Я впервые создаю решения с открытым исходным кодом (с использованием таких инструментов, как LoadRunner), и мои потребности заключаются в том, чтобы эта среда работала с инструментами непрерывной интеграции, такими как Jenkins/Hudson, и внутренним инструментом управления тестами для составления отчетов о результатах.
Я искал этот конкретный сценарий, но не смог его найти. Я знаю, что будут многочисленные интеграции, плагины и т. Д., Которые нужно будет построить. Мой вопрос заключается в том, можете ли вы дать некоторые указания (даже хорошие чтения в порядке) на начало создания этой платформы с помощью решений с открытым исходным кодом?
7 ответов
- Selenium позволит вам автоматизировать все ваши веб-(браузерные) действия.
- Junit/ TestNG в качестве основы тестирования, включая систему отчетов по умолчанию
- Maven для управления проектом и жизненного цикла (включая этап тестирования с верным плагином)
- Jenkins - хороший инструмент интеграции, который легко запустит вышеописанную настройку
Удачи!
Я даю здесь функции фреймворка, которые очень сокращают код
public TestBase() throws Exception{
baseProp = new Properties();
baseProp.load(EDCPreRegistration.class.getResourceAsStream("baseproperties.properties"));
// Firefox profile creation
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.type", ProxyType.AUTODETECT.ordinal());
profile.setPreference("browser.cache.disk.enable", false);
profile.setPreference("network.proxy.http", "localhost");
profile.setPreference("network.proxy.http_port",8080);
driver = new FirefoxDriver(profile);
//System.setProperty("webdriver.ie.driver","E:\\Phyweb Webdriver\\IEDriverServer.exe");
//driver = new InternetExplorerDriver();
driver.manage().window().maximize();
}
//To find WebElement by id
public static WebElement FindElement(String id)
{
try
{
webElement= driver.findElement(By.id(id));
}
catch(Exception e)
{
Print(e);
}
return webElement;
}
//To find WebElement by name
public static WebElement FindElementByName(String name)
{
try
{
webElement= driver.findElement(By.name(name));
}
catch(Exception e)
{
Print(e);
}
return webElement;
}
//To find WebElement by Class
public static WebElement FindElementByClass(String classname)
{
try
{
webElement= driver.findElement(By.className(classname));
}
catch(Exception e)
{
Print(e);
}
return webElement;
}
//To get data of a cell
public static String GetCellData(XSSFSheet sheet,int row,int col)
{
String cellData = null;
try
{
cellData=PhyWebUtil.getValueFromExcel(row, col, sheet);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return cellData;
}
//To click a button using id
public static void ClickButton(String id,String label)
{
try
{
WebElement webElement= FindElement(id);
Snooze();
webElement.click();
PrintMessage(label+" is selected");
}
catch(Exception e)
{
Print(e);
}
}
//To click a button using class
public void ClickButtonByClass(String classname,String label)
{
try
{
WebElement webElement= FindElementByClass(classname);
Snooze();
webElement.click();
PrintMessage(label+" is selected");
}
catch(Exception e)
{
Print(e);
}
}
//To enter data into Textbox
public String editTextField(int rownum, int celnum,WebElement element ,XSSFSheet sheet,String Label)
{
XSSFRow row = sheet.getRow(rownum);
XSSFCell Cell = row.getCell(celnum);
String inputValue = Cell.getStringCellValue().trim();
element.clear();//To clear contents if present
try
{
element.sendKeys(inputValue);
String elementVal=element.toString();
if(elementVal.contains("password"))
{
PrintMessage("Password is entered");
}
else
{
PrintMessage("Value entered for "+Label+" is "+inputValue);
}
}
catch(Exception e){
Print(e);
//cv.verifyTrue(false, "<font color= 'red'> Failed due to : </font> "+e.getMessage());
}
return inputValue;
}
//To enter data into Textbox
public String editTextFieldDirect(WebElement element ,String text,String label)
{
element.clear();//To clear contents if present
try
{
element.sendKeys(text);
String elementVal=element.toString();
if(elementVal.contains("password"))
{
PrintMessage("Password is entered");
}
else
{
PrintMessage("Value entered for "+label+" is "+text);
}
}
catch(Exception e){
Print(e);
//cv.verifyTrue(false, "<font color= 'red'> Failed due to : </font> "+e.getMessage());
}
return text;
}
//To select Radio button
public void ClickRadioButton(String id)
{
try
{
WebElement webElement= FindElement(id);
Snooze();
webElement.click();
text=webElement.getText();
PrintMessage(text+" is selected");
}
catch(Exception e)
{
Print(e);
}
}
//To select Link
public void ClickLink(String id,String label)
{
try
{
ClickButton(id,label);
}
catch(Exception e)
{
Print(e);
}
}
//To Click an Image button
public void ClickImage(String xpath)
{
try
{
WebElement webElement= FindElement(id);
Snooze();
webElement.click();
text=GetText(webElement);
PrintMessage(text+" is selected");
}
catch(Exception e)
{
Print(e);
}
}
//Select a checkbox
public void CheckboxSelect(String id,String label)
{
try
{
WebElement webElement= FindElement(id);
Snooze();
webElement.click();
PrintMessage("Checkbox "+label+" is selected");
}
catch(Exception e)
{
Print(e);
}
}
//To select value in Combobox
public void SelectData(String id,String label,String cellval)
{
try
{
WebElement webElement= FindElement(id);
Snooze();
webElement.click();
String elementStr=webElement.toString();
int itemIndex=elementStr.indexOf("value");
if(itemIndex>-1)
{
int endIndex=elementStr.length()-3;
String item=elementStr.substring(itemIndex+7, endIndex);
if(cellval=="0")
{
PrintMessage(item+" is selected for "+label);
}
else
{
PrintMessage(cellval+" "+label+" is selected");
}
}
else
{
PrintMessage(cellval+" is selected for "+label);
}
}
catch(Exception e)
{
Print(e);
}
}
//To check if WebElement with id exists
public static boolean isExists(String id)
{
boolean exists = false;
driver.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);
try
{
exists=driver.findElements( By.id(id) ).size() != 0;
}
catch (Exception e)
{
Print(e);
}
if(exists==true)
return true;
else
return false;
}
//To check if WebElement with name exists
public static boolean isExistsName(String name)
{
boolean exists = false;
driver.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);
try
{
exists=driver.findElements( By.name(name) ).size() != 0;
}
catch (Exception e)
{
if(e.getMessage().contains("InvalidSelectorError"))
{
System.out.println("");
}
else
Print(e);
}
if(exists==true)
return true;
else
return false;
}
//Explicit wait until a element is visible and enabled using id
public void ExplicitlyWait(String id)
{
try
{
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
}
catch(Exception e)
{
Print(e);
}
}
//Explicit wait until a element is visible and enabled using classname
public void ExplicitlyWaitByClass(String classname)
{
try
{
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.className(classname)));
}
catch(Exception e)
{
Print(e);
}
}
//Explicit wait until a element is visible and enabled using id
public void ExplicitlyWaitSpecific(int sec,String id)
{
try
{
WebElement myDynamicElement = (new WebDriverWait(driver, sec))
.until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
}
catch(Exception e)
{
Print(e);
}
}
//Snooze for 10 seconds
public static void Snooze()
{
try
{
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
catch(Exception e)
{
Print(e);
}
}
//Snooze for Secs
public static void SnoozeSpecific(int seconds)
{
try
{
driver.manage().timeouts().implicitlyWait(seconds, TimeUnit.SECONDS);
}
catch(Exception e)
{
Print(e);
}
}
//Sleep for milliSeconds
public static void Sleep(int milisec) throws InterruptedException
{
Thread.sleep(milisec);
}
//To get text using text()
public static String GetText(WebElement element)
{
try
{
text=element.getText();
}
catch(Exception e){
Print(e);
}
return text;
}
//To get text using getAttribute("value")
public static String GetTextAttribute(WebElement element)
{
try
{
text=element.getAttribute("value");
}
catch(Exception e){
Print(e);
}
return text;
}
//To Print error messages to both Console and Results file
public static void Print(Exception e)
{
Reporter.log("Exception is :"+e.getMessage());
System.out.println(e);
}
//To Print messages to both Console and Results file
public static void PrintMessage(String str)
{
Reporter.log(str);
System.out.println(str);
}
//To Print Blank row
public static void BlankRow()
{
Reporter.log(" ");
System.out.println(" ");
}
//To Print Sub header
public static void Header(String str)
{
BlankRow();
Reporter.log("***********************"+str+" Verifications***********************");
System.out.println("***********************"+str+" Verifications***********************");
BlankRow();
}
//To Print Sub header
public static void SubHeader(String str)
{
BlankRow();
Reporter.log("-----------------------"+str+" Verifications-----------------------");
System.out.println("-----------------------"+str+" Verifications-----------------------");
BlankRow();
}
Я создал библиотеку Java на вершине селена, которая упрощает автоматизацию тестирования веб-сайта. Он имеет неявный механизм ожидания и прост в использовании:
https://github.com/gartenkralle/web-ui-automation
Пример:
import org.junit.Test;
import org.openqa.selenium.By;
import common.UserInterface;
import common.TestBase;
public class Google extends TestBase
{
private final static String GOOGLE_URL = "https://www.google.com/";
private final static By SEARCH_FIELD = By.xpath("//input[@id='lst-ib']");
private final static By AUTO_COMPLETION_LIST_BOX = By.xpath("//*[@id='sbtc']/div[2][not(contains(@style,'none'))]");
private final static By SEARCH_BUTTON = By.xpath("//input[@name='btnK']");
@Test
public void weatherSearch()
{
UserInterface.Action.visitUrl(GOOGLE_URL);
UserInterface.Action.fillField(SEARCH_FIELD, "weather");
UserInterface.Verify.appeared(AUTO_COMPLETION_LIST_BOX);
UserInterface.Action.pressEscape();
UserInterface.Action.clickElement(SEARCH_BUTTON);
}
}
Мы начинаем разрабатывать что-то очень связанное с вашими потребностями; Java, Webdriver, Jenkins, Maven и т. Д. Мы довольно новы в области автоматизации, но у нас все еще есть хорошие ресурсы Java. Мы создаем нашу структуру на основе Тарун Кумар с www.seleniumtests.com. У него есть много хороших видео с Youtube (качество звука не очень хорошее), и ему удается создать что-то очень удобное для пользователя, используя PageObjects Pattern. Если вы не знаете, с чего начать, я бы начал с этого. Удачи!
До тех пор, пока у вас есть командная строка для запуска вашей платформы и вы отправляете отчеты, используя формат журнала xunit, вы должны быть хороши для интеграции с любым количеством сред непрерывной интеграции.
Ваш компромисс при запуске экземпляра браузера под нагрузкой будет заключаться в меньшем количестве виртуальных пользователей на хост и очень тщательном изучении ресурсов вашего генератора нагрузки под нагрузкой. Не забудьте включить в свою инфраструктуру API мониторинга для показателей системы под нагрузкой и механизм автоматической оценки, связанный с принятием показателей SLA, для определения прохождения критериев отказа при нагрузке в данной точке нагрузки.
Selenium Webdriver - Selenium - веб-инструмент для автоматизации, который автоматизирует все, что доступно на веб-странице. Вы используете Selenium Webdriver с JAVA.
Watij- Тестирование веб-приложений в Java Автоматизирует функциональное тестирование веб-приложений через настоящие веб-браузеры.
Gatling- для тестирования производительности и стресс-тестирования
Jenkins- Jenkins предоставляет услуги непрерывной интеграции для разработки программного обеспечения.
Selenium-Webdriver, безусловно, является инструментом для автоматизации пользовательского интерфейса, и мы широко используем его для перекрестного тестирования браузеров в облачных решениях, таких как Browser Stack.
Наш пример использования позволил нам создать "омлет" с открытым исходным кодом Framework, встроенный в Java, используя TestNG в качестве тестового прогона, который заботится обо всем, что связано с веб-тестированием, и оставляет нас фактически автоматизированным приложением, а не думает о отчетах, параллельном запуске и CI интеграция и т. д.
Предложение, вклад всегда приветствуется:)
Документация здесь и ссылка на Github здесь
Не забудьте оформить 5 минут учебник на сайте
Для функционального регрессионного теста:
TestProject
Selenium
Cucumber: это инструмент BDD
Для нефункциональных: производительность и нагрузочное тестирование:
Примечание: TestComplete - очень хороший коммерческий инструмент.