Prueba de humo de un candidato de liberación con pruebas automáticas en 15 minutos

Mi nombre es Lilia, soy QA Líder en uno de los proyectos del grupo financiero BCS (un servicio para seleccionar ofertas favorables para un cliente de una serie de productos de préstamo), y hoy les contaré cómo automatizamos las pruebas de smock, qué problemas encontramos y qué tecnología apilamos.

Al principio decidimos automatizar las pruebas de regresión, pero a medida que pasaba el tiempo, la funcionalidad cambió y nos dimos cuenta de que se dedicaba mucho tiempo a respaldar las pruebas automáticas ya escritas. Por lo tanto, decidieron automatizar primero la prueba de humo y luego expandirla para realizar pruebas de regresión automáticamente. El departamento de pruebas se encargó de automatizar las pruebas de smock lo antes posible. El proyecto continuó creciendo y adquiriendo características adicionales.

¿Qué es la prueba de humo?


La prueba de humo, como también se la llama "prueba de humo", es una prueba rápida de la funcionalidad más crítica.

En nuestro proyecto:

  • Registro / autorización.
  • Entrada
  • Completar el cuestionario.
  • Muestra de ofertas.
  • Enviar una aplicación / hacer clic en el enlace al sitio web del socio.
  • Comentarios
  • Bloqueo

Pila de tecnologías para escribir autotests


Escribimos pruebas automáticas en una pila de este tipo: Java + Selenium + Cucumber + informes en Allure2.

imagen

Pruebas automáticas de BDD para pruebas de humo


1. Un archivo de características con la extensión .feature que describe los scripts de prueba en Gerkin.

Un ejemplo:

:  ,     @all :              :      :      **********  :       :       ****  :         :            :       :       :       :       :       

2. Pasos pasos. Contiene clases que describen acciones con elementos en la página y validan estos elementos.

Un ejemplo:

 @When("^  (.*)") public void pressKey(String key) { webElementUtils.pressKey(key); } @When("^(.*):   (.*)") public void press(String pageTitle, String elementName) { waitUtils.waitElementToBeClickable(getWebElementOnWebPageWithWaiter(elementName, pageTitle)).click(); } @When("^(.*):    (.*)") public void checkCheckbox(String pageTitle, String elementName) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); if (!webElementUtils.isCheckboxSelected(element)) { element.click(); } } @When("^(.*):    (.*)") public void uncheckCheckbox(String pageTitle, String elementName) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); if (webElementUtils.isCheckboxSelected(element)) { element.click(); } } @And("^(.*):    (.*)$") public void erase(String pageTitle, String elementName) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); webElementUtils.clearElement(element); } @And("^(.*):   (.*)  (.*)$") public void enterValue(String pageTitle, String elementName, String text) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); webElementUtils.fillElementWithText(element, expressionUtils.parseString(text)); } @And("^(.*):  (.*)  (.*)$") public void selectValue(String pageTitle, String dropdownListName, String value) { WebElement element = getWebElementOnWebPageWithWaiter(dropdownListName, pageTitle); webElementUtils.selectValueFromCombobox(element, value); } @Then("^(.*):  (.*)  $") public void elementDoesNotContainAnyText(String pageTitle, String elementName) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); assertEquals("", webElementUtils.getTextFromWebElement(element).trim()); } @Then("^(.*):  (.*)    (.*)$") public void checkSliderPosition(String pageTitle, String elementName, String expectedPosition) { WebElement element = getWebElementOnWebPageWithWaiter(elementName, pageTitle); String sliderTrackPosition = StringUtils.substringBetween(element.findElement(By.cssSelector(".rc-slider-track")).getAttribute("style"), "width: ", ";"); String sliderHandlePosition = StringUtils.substringBetween(element.findElement(By.cssSelector(".rc-slider-handle")).getAttribute("style"), "left: ", ";"); assertEquals(expectedPosition, sliderTrackPosition); assertEquals(expectedPosition, sliderHandlePosition); } @Then("^(.*):   (.*)$") public void checkComponentIsDisplayed(String pageTitle, String component) { WebElement element = getWebElementOnWebPageWithWaiter(component, component); assertTrue(webElementUtils.isElementVisible(element)); } @When("^(.*):   (.+)  (.*)$") public void loadFileInField(String pageTitle, String fileName, String elementName) { WebElement element = getWebElementOnWebPage(elementName, pageTitle); File file = new File(Objects.requireNonNull(getClass().getClassLoader().getResource(fileName)).getFile()); element.sendKeys(file.getAbsolutePath()); } @Then("^(.+):   (.+)  (.+)   (.+)$") public void checkAttributeInElement(String pageTitle, String elementName, String attributeName, String expectedValue) { WebElement element = getWebElementOnWebPage(elementName, pageTitle); String attribute = webElementUtils.getAttribute(element, attributeName); String message = String.format(" '%s'   '%s'   '%s'    .\n" + " : '%s'.\n : '%s'.\n", attributeName, elementName, pageTitle, expectedValue, attribute); assertEquals(message, expectedValue, attribute); } @Then("^(.+):   (.+)  (.+)/$") public void checkValueTag(String pageTitle, String tagName, String expectedValue) { WebElement title = webDriver.findElement(By.tagName(tagName)); assertEquals(expectedValue, title.getAttribute("innerHTML").trim()); } } 

3. Trabajar con localizadores en páginas (patrón de PageObject)

Un ejemplo:

 import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import ru.bcs.creditmarkt.acceptance.pageobject.annotation.PageObject; import ru.yandex.qatools.htmlelements.annotations.Name; @PageObject(title = "", path = "/entry/login") public class LoginPage extends WebPage { @Name(" ") @FindBy(xpath = "//a[text()='']") private WebElement registrationLink; @Name(" ") @FindBy(xpath = "//a[text()='']") private WebElement loginLink; @Name(" ") @FindBy(css = "#phone") private WebElement phoneInput; @Name("  ") @FindBy(css = "button[type=submit]") private WebElement receiveCodeButton; @Name("  ") @FindBy(css = "input#sms") private WebElement smsInput; @Name("      ") @FindBy(css = "button#personalAgreement") private WebElement personalAgreementCheckbox; @Name(" -") @FindBy(css = "div.wa-userpic") private WebElement chatBotIcon; } 

4. Informe en Allure2

imagen

Configuración de CI


Mientras escribíamos las pruebas automáticas, el grupo financiero de BCS apareció Selenoid, y pudimos configurar el lanzamiento de pruebas en la tubería GitLab

Organización de autotests de escritura para diferentes stands.


Tenemos varios stands en los que se lleva a cabo el desarrollo, la depuración y la aceptación, y también hay muchos stands donde probamos nuevas funciones desarrolladas por equipos distribuidos.

También tenemos varios stands de sucursal que corresponden a diferentes entornos de desarrollo, cuando se cambian los archivos en el stand, el stand correspondiente con pruebas automáticas se inicia automáticamente.

Total


Ahora, en nuestro proyecto, cuando publicamos un lanzamiento en un puesto de aceptación, se realiza automáticamente un conjunto completo de pruebas de humo en 15 minutos en modo automático. Dependiendo de los resultados, el equipo de prueba decide aceptar el candidato de lanzamiento para la prueba de regresión.

Source: https://habr.com/ru/post/459734/


All Articles