我的名字叫莉莉亚(Lilia),我是BCS金融集团的一个项目的质量保证负责人(一项服务,可以从许多贷款产品中为客户选择优惠价格),今天我将告诉您我们如何进行自动模拟测试,遇到的问题以及使用的技术栈。
最初,我们决定自动化回归测试,但是随着时间的流逝,功能发生了变化,我们意识到花了很多时间来支持已经编写的自动测试。 因此,他们决定先使smok测试自动化,然后再扩展它以自动进行回归测试。 测试部门的任务是尽快进行工作服测试的自动化。 该项目继续发展并获得了更多功能。
什么是烟雾测试
烟雾测试(也称为“烟雾测试”)是对最关键功能的快速测试。
在我们的项目中:
- 注册/授权。
- 入口处
- 填写问卷。
- 展示优惠。
- 发送应用程序/单击指向合作伙伴网站的链接。
- 反馈。
- 阻塞。
编写自动测试的技术堆栈
我们在这样的堆栈上编写自动测试:Java + Selenium + Cucumber + Allure2中的报告。

用于烟雾测试的BDD自动测试
1.扩展名为.feature的功能文件,其中包含Gerkin中测试脚本的描述。
一个例子:
: , @all : : : ********** : : **** : : : : : : :
2.步骤步骤。 它包含描述页面上元素的操作并验证这些元素的类。
一个例子:
@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.使用页面上的定位器(PageObject模式)
一个例子:
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. Allure2中的报告

CI设置
在编写自动测试时,BCS财务小组出现了Selenoid,并且我们能够在pipline GitLab中配置测试的启动
组织不同展位的自动测试写作
我们在几个展台上进行开发,调试和验收,还有许多功能展台,我们可以测试分布式团队开发的新功能。
我们还有几个分支支架,分别对应于不同的开发环境,当更改支架上的文件时,具有自动测试的相应支架会自动启动。
合计
现在在我们的项目中,当在验收台上发布发行版时,将在15分钟内以自动模式自动执行全套smok测试。 根据结果,测试团队决定接受候选发布版本进行回归测试。