Mein Name ist Lilia, ich bin QS-Leiterin in einem der Projekte der BCS-Finanzgruppe (ein Service zur Auswahl günstiger Angebote für einen Kunden aus einer Reihe von Kreditprodukten), und heute werde ich Ihnen erzählen, wie wir Kittelprüfungen automatisiert haben, auf welche Probleme wir gestoßen sind und welchen Technologie-Stack wir verwenden.
Zuerst haben wir uns entschlossen, die Regressionstests zu automatisieren, aber im Laufe der Zeit änderte sich die Funktionalität und wir stellten fest, dass viel Zeit für die Unterstützung bereits geschriebener Autotests aufgewendet wurde. Aus diesem Grund haben sie beschlossen, den Rauchtest zuerst zu automatisieren und dann zu erweitern, um automatisch Regressionstests durchzuführen. Die Testabteilung wurde beauftragt, die Kittelprüfung so schnell wie möglich zu automatisieren. Das Projekt wuchs weiter und erwarb zusätzliche Funktionen.
Was ist Rauchtest?
Die Rauchprüfung, auch als „Rauchprüfung“ bezeichnet, ist eine schnelle Prüfung der wichtigsten Funktionen.
Zu unserem Projekt:
- Registrierung / Autorisierung.
- Eingang
- Fragebogen ausfüllen.
- Showcase-Angebote.
- Senden einer Bewerbung / Klicken auf den Link zur Website des Partners.
- Rückkopplung.
- Blockieren.
Stapel von Technologien zum Schreiben von Autotests
Wir schreiben Autotests auf einen solchen Stapel: Java + Selen + Gurke + Berichte in Allure2.

BDD Auto Tests für Rauchtests
1. Feature-Datei mit der Erweiterung .feature mit einer Beschreibung der Testskripte in Gerkin.
Ein Beispiel:
: , @all : : : ********** : : **** : : : : : : :
2. Schritte Schritte. Es enthält Klassen, die Aktionen mit Elementen auf der Seite beschreiben und diese Elemente validieren.
Ein Beispiel:
@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. Arbeiten mit Locators auf Seiten (PageObject-Muster)
Ein Beispiel:
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. Bericht in Allure2

CI-Setup
Während wir Autotests schrieben, erschien die BCS-Finanzgruppe Selenoid, und wir konnten den Start von Tests in Pipline GitLab konfigurieren
Organisation von Autotests für verschiedene Stände
Wir haben mehrere Stände, an denen Entwicklung, Debugging und Akzeptanz stattfinden, und es gibt auch viele Feature-Stände, an denen wir neue Funktionen testen, die von verteilten Teams entwickelt wurden.
Wir haben auch mehrere Zweigstände, die unterschiedlichen Entwicklungsumgebungen entsprechen. Wenn Sie Dateien auf dem Stand ändern, wird der entsprechende Stand mit automatischen Tests automatisch gestartet.
Insgesamt
Wenn in unserem Projekt eine Veröffentlichung auf einem Akzeptanzstand veröffentlicht wird, wird im automatischen Modus automatisch in 15 Minuten ein vollständiger Satz von Rauchtests durchgeführt. Abhängig von den Ergebnissen beschließt das Testteam, den Release-Kandidaten zum Testen für Regressionstests zu akzeptieren.