maven配置junit5_JUnit 5和Selenium –改善项目配置

maven配置junit5

Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行通信的协议)和浏览器驱动程序。 Selenium WebDriver的主要优点之一是,它受所有主要编程语言的支持,并且可以在所有主要操作系统上运行。

带有Selenium WebDriverJUnit 5的这一部分–教程中,您将了解JUnit 5的其他功能,这些功能将通过并行运行测试,配置测试顺序和创建参数化测试来帮助您减少测试的执行时间。

您还将学习如何利用Selenium Jupiter功能,例如通过系统属性进行测试执行配置,单个浏览器会话测试以加快测试执行速度或捕获测试中的屏幕截图。 最后,您将学习如何将AssertJ库添加到您的项目。

关于本教程

您正在阅读带有Selenium WebDriverJUnit 5的第三部分-教程

本教程中的所有文章:

  • 第1部分– 从头开始设置项目–使用JUnit 5和Jupiter Selenium进行Gradle
  • 第2部分– 使用Selenium内置的PageFactory实现Page Object Pattern
  • 第3部分– 改进项目配置–并行执行测试,测试执行顺序,参数化测试,AssertJ等

本教程的源代码可以在Github上找到

使用JUnit 5并行测试执行

JUnit 5带有内置的并行测试执行支持。

以下命令将并行运行TodoMvcTests的测试方法:

 ./gradlew clean test --tests *TodoMvcTests -Djunit.jupiter.execution.parallel.enabled= true -Djunit.jupiter.execution.parallel.mode. default =concurrent 

构建成功,在执行过程中,您应该注意到两个Chrome浏览器实例正在运行。 在此运行中,所有测试的执行时间减少到10秒:

 > Task :test  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > createsTodo() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > createsTodosWithSameName() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > togglesAllTodosCompleted() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > togglesTodoCompleted() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > clearsCompletedTodos() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > editsTodo() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > removesTodo() PASSED  BUILD SUCCESSFUL in 10s  4 actionable tasks: 4 executed 

提示:有关更多选项,请查阅文档: https : //junit.org/junit5/docs/current/user-guide/#writing-tests-parallel-execution

使用JUnit 5测试执行顺序

自动化测试应能够独立运行且无特定顺序,并且测试结果不应依赖于先前测试的结果。 但是在某些情况下,可以证明测试执行的特定顺序。

默认情况下,在JUnit 5中,测试方法的执行在构建之间是可重复的,因此具有确定性,但是该算法是故意不明显的(作为库状态的作者)。 幸运的是,可以使用内置方法定购器或通过创建自定义定购器来调整执行顺序以满足我们的需求。 我们将使用@Order批注提供测试方法的排序,并使用@TestMethodOrder注释类,以指示JUnit 5方法已排序。

 @ExtendWith (SeleniumExtension. class )  @SingleSession  @TestMethodOrder (MethodOrderer.OrderAnnotation. class )  @DisplayName ( "Managing Todos" @DisplayName "Managing Todos" )  class TodoMvcTests { @Test @Order ( 1 ) @DisplayName ( "Creates Todo with given name" ) void createsTodo() { } @Test @Order ( 2 ) @DisplayName ( "Creates Todos all with the same name" @DisplayName "Creates Todos all with the same name" ) void createsTodosWithSameName() { } // rest of the methods omitted for readability  } 

在本文中阅读有关JUnit 5中测试执行顺序的更多信息: https : //blog.codeleak.pl/2019/03/test-execution-order-in-junit-5.html

Selenium Jupiter的单个浏览器会话

您可能已经注意到,对于TodoMvcTests类中的每个测试, TodoMvcTests启动一个新的Chrome浏览器实例,并在每个测试之后将其关闭。 此行为导致整个套件的执行花费了相当多的时间(上一次执行需要27秒)。 Selenium Jupiter附带了一个方便的类级别注释,可以更改此行为。 @SingleSession批注会更改行为,以便在所有测试之前初始化浏览器实例一次,并在所有测试之后关闭浏览器实例。

要应用@SingleSession我们需要稍微修改测试类,并将驱动程序对象注入到构造函数中,而不是注入到@BeforeEach方法中。 我们还需要注意每次测试的正确状态。 这可以通过清除@AfterEach方法中@AfterEach存储的本地存储来完成。 我还创建了一个字段driver ,该字段driver保留了所有测试中使用的驱动程序对象实例。

我使用注入到@BeforeEach@AfterEach方法中的驱动程序测试了@SingleSession ,但似乎这没有按预期方式工作,并且每次执行新测试时,都会创建一个新的驱动程序实例。 我相信这是库的另一个设计缺陷。

 private final ChromeDriver driver;  public TodoMvcTests(ChromeDriver driver) { this .driver = driver; this .todoMvc = PageFactory.initElements(driver, TodoMvcPage. class ); this .todoMvc.navigateTo();  }  @AfterEach  void storageCleanup() { driver.getLocalStorage().clear();  } 

当我们执行测试时,我们可以观察到执行所有测试的时间大大减少了:

 ./gradlew clean test  > Task :test  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > editsTodo() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > togglesTodoCompleted() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > createsTodo() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > removesTodo() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > togglesAllTodosCompleted() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > createsTodosWithSameName() PASSED  pl.codeleak.demos.selenium.todomvc.TodoMvcTests > clearsCompletedTodos() PASSED  pl.codeleak.demos.selenium.todomvc.SeleniumTest > projectIsConfigured(ChromeDriver) PASSED  BUILD SUCCESSFUL in 9s  3 actionable tasks: 3 executed 

提示:如果您希望从选定的类中运行测试,则可以使用Gradle测试任务随附的测试过滤。 例如,此命令将仅运行TodoMvcTests类中的测试: ./gradlew clean test --tests *.todomvc.TodoMvcTests

并行执行单个浏览器会话测试

请注意,如果您现在尝试使用JUnit 5并行性并行执行测试,则测试将失败。 在并行执行中,每个方法都需要单独的驱动程序实例,并启用@SingleSession我们为所有测试共享一个实例。 为了解决这个问题,我们需要运行测试配置并行执行,以便顶级类并行运行,但方法在同一线程中。

只需复制TodoMvcTests类,然后尝试以下命令:

 ./gradlew clean test --tests *TodoMvcTests -Djunit.jupiter.execution.parallel.enabled= true -Djunit.jupiter.execution.parallel.mode. default =same_thread -Djunit.jupiter.execution.parallel.mode.classes. default =concurrent 

在执行过程中,您应该看到3个浏览器正在运行并在终端中输出,类似于以下内容:

 <===========--> 87 % EXECUTING [3s]  > :test > 0 tests completed  > :test > Executing test pl.codeleak.demos.selenium.todomvc.MoreTodoMvcTests  > :test > Executing test pl.codeleak.demos.selenium.todomvc.EvenMoreTodoMvcTests  > :test > Executing test pl.codeleak.demos.selenium.todomvc.TodoMvcTests 

Selenium Jupiter的通用驱动程序配置

在当前测试中,我们将ChromeDriver直接注入到测试类中。 但是在某些情况下,我们希望对注入的驱动程序有更多的控制,而我们宁愿注入WebDriver(接口)并稍后决定应该注入哪个驱动程序实例。 我们还需要更改storageCleanup()方法,因为通用WebDriver不提供直接的localStorage访问:

 public TodoMvcTests(WebDriver driver) { this .driver = driver; this .todoMvc = PageFactory.initElements(driver, TodoMvcPage. class ); this .todoMvc.navigateTo();  }  @AfterEach  void storageCleanup() { ((JavascriptExecutor) driver).executeScript( "window.localStorage.clear()" );  } 

现在,要在运行时更改浏览器类型,我们需要调整sel.jup.default.browser config属性。

配置JUnit 5和Selenium Jupiter的常见方法之一是通过Java系统属性。 可以使用属性文件以编程方式完成此操作,也可以使用-D开关将属性直接传递给JVM。 为了确保在执行Gradle时传递给JVM的属性在测试中可用,我们需要修改build.gradle ,如下所示:

 test { // Make system properties available in tests systemProperties System.getProperties() useJUnitPlatform() testLogging { events "passed" , "skipped" , "failed" }  } 

到目前为止,当您运行./gradlew clean test -Dprop=value类的命令时,该属性prop将在测试中可用。

通过上述更改,我们可以选择浏览器类型来运行测试:

 ./gradlew clean test --tests *TodoMvcTests -Dsel.jup. default .browser=firefox 

使用Selenium Jupiter保存屏幕截图

Selenium Jupiter允许在测试结束时保存屏幕截图-始终或仅在失败时保存。 您还可以自定义输出目录和格式。

 ./gradlew clean test --tests *TodoMvcTests -Dsel.jup. default .browser=firefox -Dsel.jup.screenshot.at.the.end.of.tests= true -Dsel.jup.screenshot.format=png -Dsel.jup.output.folder=/tmp 

提示:有关更多选项,请查阅文档: https : //bonigarcia.github.io/selenium-jupiter/#screenshots

使用JUnit 5进行参数化测试

参数化单元测试的总体思路是对不同的测试数据运行相同的测试方法。 要在JUnit 5中创建参数化测试,请使用@ParameterizedTest注释测试方法,并提供该测试方法的参数源。 有几种可用的参数来源,包括:

  • @ValueSource –提供对文字值数组(即短裤,整数,字符串等)的访问。
  • @MethodSource –提供对从工厂方法返回的值的访问
  • @CsvSource –从一个或多个提供的CSV行中读取逗号分隔值(CSV)
  • @CsvFileSource –用于加载逗号分隔值(CSV)文件

在下一个示例中,我们将使用存储在src/test/resources目录中的以下CSV:

 todo;done  Buy the milk; false  Clean up the room; true  Read the book; false 

为了在测试中使用上述CSV文件,我们需要使用@ParameterizedTest注释(而不是@Test )对测试进行注释,然后使用@CsvFileSource注释指向该文件:

 @ParameterizedTest  @CsvFileSource (resources = "/todos.csv" , numLinesToSkip = 1 , delimiter = ';' )  @DisplayName ( "Creates Todo with given name" )  void createsTodo(String todo) { todoMvc.createTodo(todo); assertSingleTodoShown(todo);  } 

CSV文件中的每个记录都有两个字段: namedone 。 在上述测试中,仅使用待办事项的名称。 但是我们当然可以使测试复杂一点,并同时使用这两个属性:

 @ParameterizedTest (name = "{index} - {0}, done = {1}" )  @CsvFileSource (resources = "/todos.csv" , numLinesToSkip = 1 , delimiter = ';' )  @DisplayName ( "Creates and optionally removes Todo with given name" )  void createsAndRemovesTodo(String todo, done) { boolean done) { todoMvc.createTodo(todo); assertSingleTodoShown(todo); todoMvc.showActive(); assertSingleTodoShown(todo); if (done) { todoMvc.completeTodo(todo); assertNoTodoShown(todo); todoMvc.showCompleted(); assertSingleTodoShown(todo); } todoMvc.removeTodo(todo); assertNoTodoShown(todo);  } 

请注意,同一测试类别/

了解更多关于这篇文章中参数的测试: https://blog.codeleak.pl/2017/06/cleaner-parameterized-tests-with-junit-5.html也经历了JUnit 5文档: https://开头的JUnit .org / junit5 / docs / current / user-guide /#writing-tests-parameterized-tests

使用AssertJ更好的断言

JUnit 5具有许多内置的断言,但是当真正的工作开始时,您可能需要的远远超出了JUnit 5所能提供的。 在这种情况下,我建议使用AssertJ库。 AssertJ AssertJ是一个Java库,提供了丰富的断言集,真正有用的错误消息,提高了测试代码的可读性,并且设计为在您喜欢的IDE中非常容易使用。

AssertJ的一些功能:

  • 对许多Java类型的流利断言,包括日期,集合,文件等。
  • SoftAssertions(类似于JUnit 5的assertAll)
  • 复杂领域比较
  • 可以轻松扩展–自定义条件和自定义断言

要在项目中使用AssertJ,我们需要向build.gradle添加一个依赖build.gradle

 testCompile( 'org.assertj:assertj-core:3.13.2' ) 

首先,我们需要静态导入org.assertj.core.api.Assertions.*并使用带有assertThat方法的代码完成: assertThat(objectUnderTest).

例如,您将编写assertThat(todoMvc.getTodosLeft()).isEqualTo(3); 使用AssertJ而不是assertEquals(3, todoMvc.getTodosLeft()); 在普通的JUnit 5或assertThat(todoMvc.todoExists(readTheBook)).isTrue()而不是assertTrue(todoMvc.todoExists(readTheBook))

使用复杂类型甚至更好:

 todoMvc.createTodos(buyTheMilk, cleanupTheRoom, readTheBook);  assertThat(todoMvc.getTodos()) .hasSize( 3 ) .containsSequence(buyTheMilk, cleanupTheRoom, readTheBook); 

请访问官方文档以了解有关AssertJ的更多信息: https ://assertj.github.io/doc/

提示:阅读有关将AssertJ与JUnit 5集成的更多信息: https ://blog.codeleak.pl/2017/11/junit-5-meets-assertj.html

摘要

在本文中,我介绍了如何利用JUnit 5的内置功能来提高项目配置的速度,但不仅限于速度。 您还了解了如何利用某些Selenium Jupiter功能来改进项目。

看起来可能已经很多了,JUnit 5和Selenium Jupiter都提供了更多功能。 查看两个项目文档,并找出对当前或将来的项目有用的其他内容:

  • https://bonigarcia.github.io/selenium-jupiter/
  • https://junit.org/junit5/

翻译自: https://www.javacodegeeks.com/2019/12/junit-5-and-selenium-improving-project-configuration.html

maven配置junit5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

形容计算机网络教室的成语,形容教育的成语

形容教育的成语形容教育的成语【不教而杀】 【弦歌之声】 【化及冥顽】 【蒙以养正】【不言之教】 【沂水春风】 【嘉言善状】 【神道设教】【不教之教】 【相夫教子】 【画荻教子】 【磨昏抉聩】【东风化雨】 【因材施教】 【教无常师】 【脱骨换胎】…

Class的 getSuperclass与getGenericSuperclass区别

Class的getInterfaces与getGenericInterface区别 http://www.cnblogs.com/maokun/p/6773076.html一、getSuperclass 返回直接继承的父类&#xff08;由于编译擦除&#xff0c;没有显示泛型参数&#xff09; Class<? super T>getSuperclass() 返回表示此 Cla…

XML——XSLT的一个简单荔枝

【0】intro to XSLT&#xff08;转自&#xff1a;http://www.w3school.com.cn/xsl/xsl_languages.asp&#xff09;0.1&#xff09;起始于 XSL XSL 指扩展样式表语言&#xff08;EXtensible Stylesheet Language&#xff09;。 万维网联盟 (W3C) 开始发展 XSL 的原因是&#xff…

Eclipse系列的隐藏宝藏– 2019年版

Eclipse Collections是一个开放源代码Java Collections框架。 在此博客中&#xff0c;我将演示该框架的五个鲜为人知的功能。 我在去年的Java Advent Calendar中发布了一个类似的博客 。 请参阅博客末尾的资源以获取有关该框架的更多信息。 1. countBy() &#xff1a;当您要查…

css html 方格,使用CSS创建方格背景

这里是一个什么样的格仔背景看起来在图形设计编辑器&#xff0c;如Photoshop或Illustrator的翻版。 (所有的CSS).checkered{height: 240px;background: -webkit-linear-gradient(45deg, rgba(0, 0, 0, 0.0980392) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.0980…

java嵌套类与内部类

一、嵌套类(Nested Classes) 使用嵌套类减少了命名冲突&#xff0c;一个内部类可以定义在一个类中&#xff0c;一个方法中甚至一个表达式中。 (1)定义 A nested(嵌套) class is any class whose declaration occurs within the body of another class or interface. A top lev…

jsr303 spring_使用Spring和JSR 303进行方法参数验证

jsr303 springSpring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法。 在这篇文章中&#xff0c;我们将看到如何使用此功能。 建立 首先&#xff0c;我们需要通过创建MethodValidationPostProcessor bean添加对方法参数验证的支持&#xff1a; Configuration publi…

优先队列——斐波那契堆(without source code)

【0】README 0.1&#xff09; 本文部分内容转自 数据结构与算法分析&#xff0c;旨在理解 斐波那契堆 的基础知识&#xff1b; 0.2&#xff09; 文本旨在理清 斐波那契堆的 核心idea&#xff0c;还没有写出源代码实现&#xff0c;表遗憾&#xff1b; 0.3&#xff09;从实际角…

计算机专业考研可关注哪些公众号,考研应关注哪些公众号?

考研应关注哪些公众号&#xff1f;2018-11-30深夜睡不着&#xff0c;看到了这个问题&#xff0c;觉得我能帮上忙&#xff0c;就坐起来写了一份回答(^_^)微信公众号有&#xff1a;考研狗之家(特别推荐&#xff0c;各种资源)考研军火库(特别推荐&#xff0c;各种技巧)考研圈考研资…

cassandra 备份_使用sstableloader恢复Cassandra Priam备份

cassandra 备份我之前曾写过关于设置Cassandra和Priam进行备份和集群管理的文章。 但是&#xff0c;我在此处提供的用于备份还原的示例并不适用于所有情况&#xff0c;例如&#xff0c;它可能不适用于完全独立的群集。 或者在部分还原到一个表而不是整个数据库的情况下。 在这…

XML——XML概述

【0】README 0.1&#xff09;本文描述 转自 core java volume 2&#xff0c; 旨在理解 XML——XML概述 的基础知识&#xff1b; 【1】XML概述相关 1&#xff09;problemsolution &#xff08;干货——引入XML的原因&#xff09; 1.1&#xff09;problem&#xff1a;1.1.1&am…

java入门配置

一、下载安装JDK JDK下载路径&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 点击 Accept License Agreement &#xff0c;选择自己的系统类型JDK下载&#xff0c;然后安装JDK。 二、安装JDK 双击JDK运行&#xff0c;选择…

华中科技大学计算机学院发表论文规定,华中科技大学等7所大学取消“研究生毕业必须发表论文”要求...

华中科技大学等7所大学取消“研究生毕业必须发表论文”要求北京晨报发表于 2006/07/17 10:51中国7所大学取消“研究生毕业必须发表论文”要求中新网7月16日电据《北京晨报》报道&#xff0c;昨天&#xff0c;记者从大学校长论坛了解到&#xff0c;中国人民大学、北京师范大学、…

计算机网络中的广播啥意思,开启无线广播啥意思

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以路由器为例&#xff0c;开启无线广播是指开启无线路由器功能。路由器(Router&#xff0c;又称路径器)是一种计算机网络设备&#xff0c;它能将数据包通过一个个网络传送至目的地(选…

jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式

jep290涉及jdk版本在我的前一篇文章中 &#xff0c;我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息。随后&#xff0c;在JDK 13中提出了一些更改&#xff0c;例如使用yield关键字从switch块返回值并在预览中发布。 在即将于明年3月在GA上市的即将发布的…

java变量作用域Scope

一、变量Scope 作用域同时决定了它的“可见性”以及“存在时间”。在C&#xff0c;C和Java里&#xff0c;作用域是由花括号的位置决定的。变量的作用域分为四个级别&#xff1a;类级、对象实例级、方法级、块级。 二、类级Scope 类级变量又称全局级变量或静态变量&#xff0c…

XML——解析XML文档

【0】README 0.1&#xff09;本文描述 转自 core java volume 2&#xff0c; 旨在理解 XML——解析XML文档 的基础知识&#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter2…

计算机维修与维护入门,计算机组装与维护基础知识

《计算机组装与维护基础知识》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机组装与维护基础知识(5页珍藏版)》请在人人文库网上搜索。1、计算机组装与维护基础知识关键考点&#xff1a;CPU主板内存硬盘显卡CMOS硬件组装操作系统学生姓名&#xff1a;总分&…

java oauth2.0_OAuth 2.0 Java指南:5分钟保护您的应用程序安全

java oauth2.0使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证&#xff0c;但是它可能给Java开发人员带来困难的挑战&#xff0c;以及…

Java编程规范

一、常见命名规则 (1)匈牙利命名法 比 较著名的命名规则是匈牙利命名法&#xff0c;但这种命名法对于跨平台移植简直是灾难。这种命名方法是由Microsoft程序员查尔斯西蒙尼(Charles Simonyi) 提出的。其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利…