你好。在本文中,我想分享我在自动化功能测试中的经验。这将是关于编写一个方便,可靠的测试框架。我们将使用的是:Java,Selenide,Alure,TestNG,Maven。
介绍
GitHub项目-SelenideBoilerplate。通常在有关测试自动化的文章中,示例远非现实,例如:driver.get (“URL”)
driver.find_element_by_id(“ID”).send_keys(“username”)
driver.find_element_by_id (“ID”).send_keys(“password”)
driver.find_element_by_id(“submit”).click()
期望,页面对象等有很多类似的例子。结果,新手测试人员可能很难正确,方便地组织所有内容。该项目充满了拐杖,这就是为什么编写新测试和维护旧测试变得越来越困难的原因。我认为有些工具过于冗长和过于复杂。我将展示一个简单,方便且易于扩展的测试框架,该框架比常规硒更易于使用,并且已经在多个项目中成功使用。该项目是基础,在实际项目中,一切都比较复杂(并行化,remoteDriver,许多测试等)。工具类
项目结构
让我们从app和pages模块开始。PageBuilder类
通常,示例给出的页面非常简单,所有内容都适合于一个类。但是在实际的项目中,可能会有相当大的页面,在一个类中描述所有功能并不是最好的主意。例如,这可以是具有多种形式的不同支付系统的充值页面。在这种情况下,最好将页面分为几个类,甚至是元素(例如,篮子中的产品),然后将其全部放到页面的主类中。因此,最好在一个位置(即PageBuilder类)中创建所有页面。package app;
import app.pages.LoginPage;
public class PageBuilder {
public static LoginPage buildLoginPage() {
return new LoginPage("/login");
}
public static BalancePage buildBalancePage() {
DepositForm depositForm = new DepositForm();
WithdrawalForm withdrawalForm = new WithdrawalForm();
return new BalancePage("/balance", depositForm, withdrawalForm);
}
}
类AppConfig
AppConfig
类存储被测Web应用程序的设置。例如-网站地址,测试用户等。在此项目中,这只是站点的地址。package app;
public class AppConfig {
public static final String baseUrl = "https://google.com";
}
应用类别
这是该模块中的主要类。在App类的构造函数中,创建所有页面。package app;
import app.pages.LoginPage;
public class App {
public LoginPage loginPage;
public App() {
loginPage = PageBuilder.buildLoginPage();
}
}
由于采用了这种方法,因此不必在测试中不断创建页面对象,只需要创建App对象即可从中获取必要的页面。同样在App类中,可能有诸如注册,注册和创建订单等方法。即,涉及多个页面对象并且在测试中经常需要的大型操作。让我们继续到页面对象
感谢Selenide,使用页面对象很容易。所有页面都继承自BasePage基类。相对页面URL传递给页面对象构造函数。所有页面元素都有一个public access 修饰符,因此您可以用命令式和声明式两种方式编写测试。同样,您可以从元素中获取必要的数据,例如文本或某些属性。定位器仅存储在一个地方。所有页面逻辑都应在页面方法中描述。使用这种方法,如果发生故障或更改,在大多数情况下,无需重写测试,只需完成该方法的确定或将定位器更改为实际的测试。
package app.pages;
import com.codeborne.selenide.SelenideElement;
import helpers.Driver;
import static com.codeborne.selenide.Selenide.*;
public class LoginPage extends BasePage {
public SelenideElement loginField = $("#login__username");
public SelenideElement passwordField = $("#login__password");
public SelenideElement signInButton = $("#login_enter");
public SelenideElement termsOfUseLabel = $("label[for=\"login_agree\"]");
public LoginPage(String pageUrl) {
super(pageUrl);
}
public void login(String email, String password) {
loginField.setValue(email);
passwordField.setValue(password);
termsOfUseLabel.click();
signInButton.click();
Driver.waitForUrlContains("account/accounts");
}
}
休息
帮助器
模块包含2个重要的类:TestConfig-从该类中,您可以获取运行测试的设置。默认设置也显示在这里。测试是通过命令运行 mvn test -Dbrowser=chrome -Dheadless=1
的,变量的值是从命令行获取的,这要归功于TestConfig类,可以在测试和应用程序中使用。例如,您可以根据环境(开发,阶段,生产)更改应用程序URL。
package helpers;
public class TestConfig {
public static String browser = "chrome";
public static String headless = "1";
public static void initConfig() {
browser = System.getProperty("browser") == null ? "chrome" : System.getProperty("browser");
headless = System.getProperty("headless") == null ? "1" : System.getProperty("headless");
}
public static boolean isHeadless() {
return headless.contains("1");
}
}
Driver
类是我用一些有用的方法包装硒和硒化物驱动程序的方法。最重要的方法:Driver.initDriver() -在此初始化驱动程序/浏览器。 public static void initDriver() {
TestConfig.initConfig();
Configuration.pageLoadStrategy = "eager";
Configuration.browserSize = "1920x1080";
Configuration.holdBrowserOpen = false;
Configuration.screenshots = false;
if(TestConfig.isHeadless()) {
Configuration.headless = true;
} else {
Configuration.headless = false;
}
switch (TestConfig.browser) {
case "chrome":
Configuration.browser = Browsers.CHROME;
break;
case "firefox":
Configuration.browser = Browsers.FIREFOX;
break;
default:
Configuration.browser = Browsers.CHROME;
break;
}
}
Driver.clearCookies()
Driver.close()
测验
所有测试类均继承自A_BaseTest类,在该类中创建App应用程序对象,logger,softAssert,浏览器打开和关闭,每次测试后清除cookie。还有一个A_BaseTestListener可以记录错误。测试看起来像这样。易于阅读,易于维护。import org.testng.annotations.Test;
public class ExampleTest extends A_BaseTest
{
@Test
public void loginViaEmail() {
app.loginPage.open();
app.loginPage.login("email@email.com", "passwords");
logger.info("Sample info message");
softAssert.assertEquals(2,2);
softAssert.assertAll();
}
}
测试类在testng.xml中指定。测试输出文件夹包含日志和屏幕截图-Driver.takeScreenshot()。对于报告,使用“ 魅力”。测试完成后,您可以运行命令allure serve target/allure-results
并查看报告。GitHub项目-SelenideBoilerplate