selenium持续集成_使用Selenium进行Spring Boot集成测试

selenium持续集成

Web集成测试允许对Spring Boot应用程序进行集成测试,而无需进行任何模拟。 通过使用@WebIntegrationTest@SpringApplicationConfiguration我们可以创建加载应用程序并在正常端口上侦听的测试。 Spring Boot的这一小增加使使用Selenium WebDriver创建集成测试变得更加容易。

测试依赖

我们将要测试的应用程序是一个简单的Spring Boot / Thymeleaf应用程序,具有spring-boot-starter-webspring-boot-starter-thymeleafspring-boot-starter-actuator依赖性。 请参阅参考资料以获取GitHub项目的链接。

测试依赖项为:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>1.5.0</version><scope>test</scope>
</dependency>
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.45.0</version><scope>test</scope>
</dependency>

网络集成测试

在经典的Spring Test中,使用MockMvc可以创建如下的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class HomeControllerClassicTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void verifiesHomePageLoads() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/")).andExpect(MockMvcResultMatchers.status().isOk());}
}

@SpringApplicationConfiguration扩展了@ContextConfiguration功能,并加载应用程序上下文以进行集成测试。 要创建没有@WebIntegrationTest环境的测试,我们应该使用@WebIntegrationTest批注定义测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest(value = "server.port=9000")
public class HomeControllerTest {}

这将在JUnit测试中启动完整的应用程序,侦听端口9000 。 有了这样的测试,我们可以轻松地使用浏览器添加Selenium并执行实际的功能测试(除非使用HtmlUnit驱动程序,否则在无头环境中将无法工作–但这不在本文的讨论范围之内)。

添加Selenium

将Selenium添加到测试中非常简单,但是我想实现的目标还不止于此,因此我创建了一个自定义批注以将测试标记为Selenium测试。 我还以允许将WebDriver注入测试实例的方式配置了它:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest(value = "server.port=9000")
@SeleniumTest(driver = ChromeDriver.class, baseUrl = "http://localhost:9000")
public class HomeControllerTest {@Autowiredprivate WebDriver driver;}

@SeleniumTest是一个自定义注释:

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@TestExecutionListeners(listeners = SeleniumTestExecutionListener.class,mergeMode = MERGE_WITH_DEFAULTS)
public @interface SeleniumTest {Class<? extends WebDriver> driver() default FirefoxDriver.class;String baseUrl() default "http://localhost:8080";
}

批注使用添加了测试执行侦听器,该侦听器将创建可在集成测试中使用的WebDriver实例。 TestExecutionListener定义用于对测试执行事件做出React的侦听器API。 它可以用来测试。 例如,Spring Test中的示例实现用于支持测试管理的事务或将依赖项注入到测试实例中。

TestExecutionListener

注意:为了更好的可读性, SeleniumTestExecutionListener的代码的某些部分被跳过。

SeleniumTestExecutionListener提供了将配置的WebDriver注入测试实例的方法。 该驱动程序实例仅创建一次,并且可以使用@SeleniumTest批注简单地更改使用的驱动程序。 最重要的是在Bean Factory中注册驱动程序。

@Override
public void prepareTestInstance(TestContext testContext) throws Exception {ApplicationContext context = testContext.getApplicationContext();if (context instanceof ConfigurableApplicationContext) {SeleniumTest annotation = findAnnotation(testContext.getTestClass(), SeleniumTest.class);webDriver = BeanUtils.instantiate(annotation.driver());// register the bean with bean factory}
}

在使用WebDriver打开应用程序的每个测试方法的基本URL之前,请执行以下操作:

@Override
public void beforeTestMethod(TestContext testContext) throws Exception {SeleniumTest annotation = findAnnotation(testContext.getTestClass(), SeleniumTest.class);webDriver.get(annotation.baseUrl());}

另外,在每次失败时都会生成一个屏幕截图:

@Override
public void afterTestMethod(TestContext testContext) throws Exception {if (testContext.getTestException() == null) {return;}File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);// do stuff with the screenshot}

每次测试后,驱动程序将关闭:

@Override
public void afterTestClass(TestContext testContext) throws Exception {if (webDriver != null) {webDriver.quit();}
}

这只是一个例子。 实现非常简单。 我们可以扩展注释和侦听器的功能。

考试

运行以下测试将启动Chrome浏览器并使用Selenium执行一些简单的检查:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest(value = "server.port=9000")
@SeleniumTest(driver = ChromeDriver.class, baseUrl = "http://localhost:9000")
public class HomeControllerTest {@Autowiredprivate WebDriver driver;private HomePage homePage;@Beforepublic void setUp() throws Exception {homePage = PageFactory.initElements(driver, HomePage.class);}@Testpublic void containsActuatorLinks() {homePage.assertThat().hasActuatorLink("autoconfig", "beans", "configprops", "dump", "env", "health", "info", "metrics", "mappings", "trace").hasNoActuatorLink("shutdown");}@Testpublic void failingTest() {homePage.assertThat().hasNoActuatorLink("autoconfig");}
}

该测试使用带有自定义AssertJ断言的简单页面对象。 您可以在GitHub中找到完整的源代码。 请参阅参考资料。

如果发生故障,驱动程序拍摄的屏幕截图将存储在适当的目录中。

摘要

@WebIntegrationTest@SpringApplicationConfiguration批注,可以在常规JUnit测试中对完全加载的Spring Boot应用程序进行集成测试。 让应用程序在测试中运行将为您提供使用Selenium并使用浏览器运行功能测试的可能性。 如果将其与Profile和Spring Test的其他功能(例如@Sql@SqlConfig@Sql@SqlConfig可能会为集成测试提供非常强大而简单的解决方案。

参考资料

  • 源代码: https : //github.com/kolorobot/spring-boot-thymeleaf
  • Spring Boot测试: http : //docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing
  • Spring测试: http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html

翻译自: https://www.javacodegeeks.com/2015/03/spring-boot-integration-testing-with-selenium.html

selenium持续集成

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

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

相关文章

这才是你想要的C语言学习路线!

点击上方蓝字关注我&#xff0c;了解更多咨询作为一门古老的编程语言&#xff0c;大家熟知它不仅是因为拥有48年的发展历程&#xff0c;更主要还是因为当下大部分程序员走入编程世界第一个学习的语言就是C语言。而近年来高速发展的物联网和智能设备&#xff0c;又把C语言推向了…

html流式布局插件,Jquery瀑布流网格布局插件

插件描述&#xff1a;一款简单且高度可定制的jQuery瀑布流网格布局插件。通过该瀑布流网格插件你可以动态添加和删除各种尺寸的图片&#xff0c;定义图片宽度&#xff0c;设置网格的列数&#xff0c;或使用流式布局方式&#xff0c;甚至还可以通过URL动态添加图片。使用该瀑布流…

mongodb上限集合_用Java创建MongoDB上限集合

mongodb上限集合在MongoDB中&#xff0c;可以以循环方式将文档的插入顺序保留到集合中。 这些类型的集合在MongoDB中称为上限集合。 MongoDB文档描述了上限集合&#xff1a; 上限集合是固定大小的集合&#xff0c;它们支持高吞吐量操作&#xff0c;这些操作根据插入顺序来插入…

编程语言:C语言与Java的细致对比,你知道选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率高;Java是面向对象的语言&#xff0c;执行效率比C语言低。C语言最关键的是比Java多了指针&#xff0c;这也说明了Java的健壮性&#xff0c;还有Java的多线程机制使…

ajax实现表单验证 html,Ajax+ajax做的表单验证

//Ajx实现异步示例&#xff0c;blur实现失去焦点触发jQuery(#formname).blur(check);function check(){alert("开始执行Ajax");//判断用户是否存在var formname jQuery("#formname").val();if(formname""){jQuery(#msgName).html(表单名称不能为…

java ee maven_针对新手的Java EE7和Maven项目–第8部分

java ee maven第一部分 &#xff0c; 第2部分 &#xff0c; 第3部分 &#xff0c; 第4部分 &#xff0c; 第5部分 &#xff0c; 第6部分 &#xff0c; 第7部分 第8部分 自上一篇文章以来&#xff0c;这一系列教程已经有很长时间了。 是时候恢复并在我们的简单项目中添加…

Python、Perl 垫底,C语言才是最环保的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询提到编程语言&#xff0c;人们第一时间想到的无非是&#xff1a;哪个编程语言简单易学&#xff0c;亦或是最挣钱等。但是编程语言功耗问题却被很多人忽视。那么作为程序员的我们如何选择编程语言&#xff0c;使其以低能耗高功效地工…

改变数据类型的装饰器_用装饰器改变收藏

改变数据类型的装饰器装饰图案 自从第一次学习编程设计模式以来&#xff0c;装饰器模式一直是我的最爱。 在我看来&#xff0c;这是一个很新颖的想法&#xff0c;比其他想法有趣得多。 不要误会我的意思&#xff0c;其他大多数人也引起了我的注意&#xff0c;但没有什么比装饰器…

khoury计算机科学学院,东北大学Open House中国站

东北大学Open House中国站 -10月26日北京 & 10月27日上海东北大学向金吉列留学的学生发来诚挚邀请&#xff0c;欢迎您的学生前来参加东北大学于 10 月 26 日(周六)在北京 和 10 月 27 日(周日)在上海 举办的东北大学 Open House 教育展。在这两个 Open House 教育展上&…

jvm jstat_使用jstat报告自定义JVM指标集

jvm jstat我一直缺少在JStat中配置自定义标头的可能性 。 当然&#xff0c;有很多预定义的数据集&#xff0c;但是如果我们可以创建自己的数据集&#xff0c;那就更好了。 正如您可能已经设计的那样&#xff0c;我正在写这篇文章&#xff0c;因为这样的功能当然是可用的:)不幸的…

知识分享:值得学习的C语言经典开源项目

点击上方蓝字关注我&#xff0c;了解节气咨询听上去有些荒谬&#xff0c;C语言的产生竟然源于一个失败的项目。1969年&#xff0c;通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目——Multics工程。该项目的目的是创建一个操作系统&#xff0c;但显然遇到了麻烦&a…

计算机主机中网卡的作用,计算机硬件组成及作用

计算机硬件组成及作用今天百分网小编介绍一下电脑各组件&#xff0c;加深一下理解&#xff0c;让还不太懂的人可以对自己的电脑有一个整体的了解&#xff0c;希望对你有所帮助!一、电源电源是电脑最重要的部件&#xff0c;相当于人体的心脏&#xff0c;向所有的零部件输送血液&…

oracle idm_批准Oracle IDM中的特定Web服务

oracle idm关于Web服务端点的快速发布&#xff0c;OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容&#xff0c;但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能&#xff08;说实话&#xff0c;SOA非常丰富&#xff0c;并且也被用作W…

C语言编程笔记:关于 for循环 的那些不为人知的秘密

点击上方蓝字关注我&#xff0c;了解更多咨询好吧&#xff0c;也许你认为我在写一篇如何使用for循环的文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;首先&#xff0c;我想说无论是学习C语言还是学习java的同学都能从此文中获益&#xff0c;还有&#xff0c;你确定你会…

chrome for mac html5,javascript – Mac上的Chrome浏览器问题

我一直在寻找很长一段时间,因为画布元素上的旋转矩形的绘制,擦除和重绘在Mac上的谷歌浏览器中不起作用.我需要这个,因为我想在画布上渲染悬停叠加层.我创建了一个代表我的代码的小提琴&#xff1a;linkHTML&#xff1a;使用Javascript&#xff1a;var canvas null;var ctx;var …

weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

weld焊接当我坐在DevConf.CZ的会议室时&#xff0c; Weld 3.0.0.Alpha4已发布 。 大约在Jozef Hartinger&#xff08; jozefhartinger &#xff09;旁边或多或少 &#xff0c;后者在共享休息前几分钟告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意&…

C语言:一种通用的程序设计语言

点击上方蓝字关注我&#xff0c;了解更多咨询语言是一种通用的程序设计语言。它同UNIX系统之间具有非常密切的关系。C语言是在UNIX系统上开发的&#xff0c;且无论是UNIX系统本身还是其上运行的大部分程序&#xff0c;都是C语言编写的。但是C语言并不受限于任何一种操作系统或机…

可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动

win10服务哪些可以禁止启动&#xff1f;方法一&#xff1a;命令方法首先使用 Windows R 组合快捷键打开“运行”窗口&#xff0c;之后键入 services.msc 按下回车键&#xff0c;即可打开“服务”。方法二&#xff1a;快捷方式法在Win10桌面的“此电脑”图标上点击鼠标右键&…

drill apache_如何使用Apache Drill分析高度动态的数据集

drill apache当今的数据是动态的&#xff0c;并由应用程序驱动。 由诸如Web /社交/移动/ IOT等行业趋势驱动的新业务应用时代的增长正在生成具有新数据类型和新数据模型的数据集。 这些应用程序是迭代的&#xff0c;并且关联的数据模型通常是半结构化的&#xff0c;无模式的且不…

如何用最短的时间学会C语言,并掌握C语言的精髓所在?

点击上方蓝字关注我&#xff0c;了解更多咨询及C语言&#xff0c;我想凡是学过它的朋友都有这样一种感觉&#xff0c;那就是“让我欢喜让我忧。”欢喜的是&#xff0c;C语言功能非常强大、应用广泛&#xff0c;一旦掌握了后&#xff0c;你就可以理直气壮地对他人说“我是电脑高…