如何为Selenium测试创建基本测试类并通过JUnit RuleChain进行初始化

在本文中,我们将继续发表一系列出版物,介绍如何在一个大型LANIT项目中自动化大型信息系统(以下称为“系统”)的手动测试(以下称为“自检”)过程以及该过程的结果。

如何有效地组织类层次结构? 如何在项目树上分发软件包? 如何确保您忘记与10个人组成的团队的合并冲突? 这些问题始终是新发展的开始,而且从来没有足够的时间。

来源

在本文中,我们描述了类的结构和代码的组织,这使我们能够轻松开发基于Junit和Selenium的一个半,半千末的2个端到端UI测试,从而具有较大的联邦意义。 此外,我们成功地支持它并不断完善现有方案。

在这里,您可以找到有关自动测试基类的层次结构,根据功能模型java-packages进行的项目细分以及真实类的示例模板的实用描述。

本文对所有基于Selenium进行自检的开发人员都非常有用。

本文是一般出版物的一部分,在其中,我们描述了一个小型团队如何构建UI测试自动化流程并为此开发基于Junit和Selenium的框架。

先前的零件:


所有测试和JUnit RuleChain的基类实现


如上一篇文章( 第2部分。技术,体系结构和技术堆栈,实现细节和技术意外 )中所示,开发自动测试的概念是基于一个框架的思想,在该框架中,为所有自动测试提供了一组系统功能-它们被无缝集成并使开发人员能够使用自动测试专注于测试类业务实施的特定问题。

该框架包括以下功能块:

  • 规则-测试基础架构组件的初始化和完成,如WebDriver的初始化和接收视频测试。 在下面更详细地描述;
  • WebDriverHandlers-用于与Web驱动程序一起工作的辅助函数,例如执行Java脚本或访问浏览器日志。 实现为一组无静态方法;
  • WebElements是一个典型Web元素或其组的库,其中包含所需的跨功能功能和典型行为。 在我们的案例中,此功能包括可能在Web浏览器侧检查异步操作是否完成。 实现为Selenium和Selenide库中Web元素的扩展。

初始化测试环境。 规则


所有测试类的关键类是BaseTest,所有测试类均从该类继承。 BaseTest类定义了测试的Junit“运行器”以及所使用的RuleChain,如下所示。 通过规则类的静态方法,可以从应用程序测试类访问规则类提供的功能。

下一个框中显示了BaseTest示例代码。

@RunWith(FilterTestRunner.class) public class BaseTest { private TemporaryFolder downloadDirRule                                                                  = new TemporaryFolder(getSomething().getWorkingDir());      @Rule     public RuleChain rules = RuleChain             .outerRule(new Timeout(TimeoutEnum.GLOBAL_TEST_TIMEOUT.value(),                                                                       TimeUnit.SECONDS))             .around(new TestLogger())             .around(new StandStateChecker())             .around(new WaitForAngularCreator())             .around(downloadDirRule)             .around(new DownloaderCreator(downloadDirRule))             .around(new EnvironmentSaver())             .around(new SessionVideoHandler())             .around(new DriverCreator(downloadDirRule))             .around(new BrowserLogCatcher(downloadDirRule))             .around(new ScreenShooter())             .around(new AttachmentFileSaver())             .around(new FailClassifier())             .around(new PendingRequestsCatcher());     //            final protected SomeObject getSomething() {         return Something.getData();    }    … } 

FilterTestRunner.class - BlockJUnit4ClassRunner的扩展,通过特殊的Filter注释的值(值=​​“ some_string_and_tag”)来过滤基于正则表达式的可执行测试的组成。 下面给出了实现。

org.junit.rules.Timeout-用于限制测试的最大持续时间。 应该先安装它,因为它会在新分支中开始测试。

TestLogger是一个类,该类允许测试以json格式记录事件以用于ELK分析。 使用来自org.junit.runner.Description的测试数据丰富事件。 它还会自动以json格式为ELK生成事件,以持续时间和结果开始测试

StandStateChecker是用于在初始化Web驱动程序之前检查目标机架的Web界面可用性的类。 快速检查支架在原则上是否可用。

WaitForAngularCreator-初始化Web驱动程序处理程序以控制异步角度操作的完成的类。 它用于通过长同步调用来自定义“特殊”测试。

org.junit.rules.TemporaryFolder-用于设置一个唯一的临时文件夹,用于存储文件以通过Web浏览器进行文件上载和下载操作。

DownloaderCreator是一个类,提供对上传到浏览器下载并通过Selenoid视频功能记录的文件的临时目录的上传操作的支持。

EnvironmentSaver-将有关测试环境的常规信息添加到Allure报告中的类。  

SessionVideoHandler-一个类,该类上载视频测试文件(如果有),并将Allure应用于报告。

DriverCreator是根据设置的参数(本地,螺线管或ggr-电磁阀)初始化WebDriver(测试中最重要的类)的类。 此外,该类将执行测试所需的一组Java脚本。 在此类之后,必须初始化访问Web驱动程序的所有规则

BrowserLogCatcher-一个类,用于从浏览器日志中读取严重消息,将其记录到ELK(TestLogger)中并将其应用于“魅力”报告。

ScreenShooter-一个用于失败测试的类,它获取浏览器屏幕的屏幕截图并将其作为WebDriverRunner.getWebDriver()应用于报表。GetScreenshotAs(OutputType.BYTES)

AttachmentFileSaver-一个类,允许您将测试业务逻辑所需的一组任意文件附加到Allure报告。 用于附加上载或下载到系统的文件。

FailClassifier是一个特殊类,在发生测试崩溃时,它会尝试确定该崩溃是否是由基础结构问题引起的。 检查屏幕上是否存在(发生崩溃后)类型为“发生系统错误编号XXXXXXXXXX”的特殊模式窗口以及类型404的系统消息等。 使您可以将失败的测试分为业务崩溃(根据方案)或系统问题。 通过扩展名org.junit.rules.TestWatcher工作。#失败的方法。

PendingRequestsCatcher是另一个特殊的类,它试图进一步分类崩溃是由角度前端和Web前端之间的不完整,挂起还是很长的休息服务引起的。 除了功能测试之外,还可以确定重负载下有问题的冷冻服务以及释放的整体稳定性。 为此,该类通过使用开放的Web驱动程序在浏览器中启动特殊的js,将所有收到的带有冻结的休息请求的事件登录到ELK中。

测试类实施模板


 package autotest.test.<sub-system>; @Feature("     TMS") @Story("    TMS") @Owner("       ") @TmsLink("    .   ") public class <   >_Test extends BaseTest { /** *           **/    Login orgTest; /**         **/    Login loginStep1;    ...    Login loginStepN;    /** *   -      -   * ...         **/      /** *    *              *    Utils.allure.message("     -", business_object) *     null,             . *             preconditions  actions    *  Utils.allure.message("      ", documentNumber) **/ @Step("  ") private void init(Login login) {    some_business_object = //         login        Utils.allure.message("     -", some_business_object)                           // ...             /**     */        loginStep1 = LoginFactory.get(_Some_Login_);    ...    loginStepN = LoginFactory.get(_Some_Login_); }    /** *       **/    @Test    @Filter("       JUnit")    @DisplayName("    TMS")    public void <   >_<>_<__>_Test() {  //            orgTest = LoginFactory.get(_Some_Login_);                //               init(orgTest);           //    -.                preconditions();               //             actions(orgTest); }    /** *        **/ @Step(" ") protected void preconditions() {    loginStep1.login();    new SomeAction().apply(someTestObject1, ..., someTestObjectN);        Utils.allure.message("   -      -", someTestObjectN)        ...    }    /** *        */ @Step(" ") protected void actions(Login testLogin) {    testLogin.reLogin();               //                new SomeAction().apply(someTestObject1, ..., someTestObjectN); } } 

测试脚本类实现模板


 package autotest.business.actions.some_subsystem; public class SomeAction {            //   PageClassA pageA = new PageClassA(); PageClassB pageB = new PageClassB();    @Step("     TMS")    @Description("     TMS")    public void apply(someTestObject1, ..., someTestObjectN) {    //   TMS        step_1(...);        step_2(...);        ...        step_N(...);    }    @Step("  1    TMS")    private void step_1(...) {       pageA.createSomething(someTestObject1);// just as an example create }    @Step("  2    TMS")    private void step_2(...) {   pageA.checkSomething(someTestObject1);// just as an example }                       ... } 

实现FilterTestRunner测试过滤类


这是BlockJUnit4ClassRunner扩展的实现,用于基于任意标记集过滤测试。

 /** * Custom runner for JUnit4 tests. * Provide capability to do additional filtering executed test methods * accordingly information that could be provided by {@link FrameworkMethod} */ public class FilterTestRunner extends BlockJUnit4ClassRunner { private static final Logger LOGGER = Logger.getLogger(FilterTestRunner.class.getName()); public FilterTestRunner(Class<?> klass) throws InitializationError {    super(klass); } /** * This method should be used if you want to hide filtered tests completely from output **/ @Override protected List<FrameworkMethod> getChildren() {    //  ,        @Filter       TestFilter filter = TestFilterFactory.get();    List<FrameworkMethod> allMethods = super.getChildren();    List<FrameworkMethod> filteredMethod = new ArrayList<>();    for (FrameworkMethod method: allMethods) {        if (filter.test(method)) {            LOGGER.config("method [" + method.getName() +"] passed by filter [" + filter.toString() + "]" );            filteredMethod.add(method);        } else {            LOGGER.config("method [" + method.getName() +"] blocked by filter [" + filter.toString() + "]" );        }    }    return Collections.unmodifiableList(filteredMethod); } /** * This method should be used if you want to skip filtered tests but no hide them @Override protected boolean isIgnored(FrameworkMethod method) {    …    if (filter.test(method)) {        return super.isIgnored(method);    } else {     return true;  }} */ } 

在下一部分中,我将讨论我们如何实现使用浏览器将文件从容器上传到测试框架的过程,以及解决了查找浏览器下载的文件名的问题。

顺便说一下,我们很乐意补充我们的团队。 当前职位空缺在这里

Source: https://habr.com/ru/post/zh-CN480910/


All Articles