系统测试集成测试单元测试_单元和集成测试的代码覆盖率

系统测试集成测试单元测试

我最近在一个宠物项目中着手构建自动化的UI(集成)测试以及普通的单元测试。 我想将所有这些集成到我的Maven构建中,并提供代码覆盖率报告,以便我可以了解测试覆盖率不足的区域。 我不仅发布了项目的源代码,还整理了一个简单的示例来演示如何获得所有这些设置。 因此,如果您希望集成maven , junit , webdriver (现在为selenium)和emma ,请继续阅读以了解我的工作方式。

首先,所有的源代码都可以在github上找到: https : //github.com/activelylazy/coverage-example 。 我将显示关键片段,但是显然有很多细节被忽略了(希望如此)不相关。

示例应用

该示例应用程序不是打破传统,而是一个简单的,即使有点人为的问候世界:

这个怎么运作

起始页面是指向hello world页面的简单链接:

<h1>Example app</h1>
<p>See the <a id="messageLink" href="helloWorld.html">message</a></p>

Hello World页面仅显示以下消息:

<h1>Example app</h1>
<p id="message"><c:out value="${message}"/></p>

hello world控制器渲染视图,并传递消息:

public class HelloWorldController extends ParameterizableViewController {// Our message factoryprivate MessageFactory messageFactory;@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {// Get the success viewModelAndView mav = super.handleRequestInternal(request, response);// Add our messagemav.addObject("message",messageFactory.createMessage());return mav;}@Autowiredpublic void setMessageFactory(MessageFactory messageFactory) {this.messageFactory = messageFactory;}
}

最后,MessageFactory仅返回硬编码的消息:

public String createMessage() {return "Hello world";
}

单元测试

我们定义了一个简单的单元测试,以验证MessageFactory的行为是否符合预期:

public class MessageFactoryTest {// The message factoryprivate MessageFactory messageFactory;@Testpublic void testCreateMessage() {assertEquals("Hello world",messageFactory.createMessage());}@Autowiredpublic void setMessageFactory(MessageFactory messageFactory) {this.messageFactory = messageFactory;}
}

建立

一个基本的maven pom文件足以构建此文件并运行单元测试。 至此,我们有了一个正在运行的应用程序,并对我们可以构建和运行的核心功能(例如它)进行了单元测试。

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>helloworld</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>helloworld Maven Webapp</name><build><finalName>helloworld</finalName></build><dependencies>...omitted...</dependencies>
</project>

代码覆盖率

现在,我们集成Emma,以便获得一些代码覆盖率报告。 首先,我们定义一个新的Maven配置文件,这使我们可以控制是否在任何给定的版本上使用emma。

<profile><id>with-emma</id><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>emma-maven-plugin</artifactId><inherited>true</inherited><executions><execution><id>instrument</id><phase>process-test-classes</phase><goals><goal>instrument</goal></goals></execution></executions></plugin></plugins></build>
</profile>

这只是在Maven“过程测试类”阶段调用“仪器”目标。 即,一旦我们编译了类文件,请使用emma对其进行检测。 我们可以通过使用新的配置文件调用Maven来运行它:

mvn clean install -Pwith-emma

构建完成后,我们可以运行Emma生成代码覆盖率报告:
在Windows上:

java -cp %USERPROFILE%/.m2/repository/emma/emma/2.0.5312/emma-2.0.5312.jar emma report -r xml,html -in coverage.ec -in target/coverage.em

在Linux上:

java -cp ~/.m2/repository/emma/emma/2.0.5312/emma-2.0.5312.jar emma report -r xml,html -in coverage.ec -in target/coverage.em

现在,我们可以在coverage / index.html中查看HTML覆盖率报告。 此时,它表明我们有50%的测试覆盖率(按类)。 MessageFactory已完全覆盖,但是HelloWorldController根本没有任何测试。

整合测试

为了测试控制器和JSP,我们将使用WebDriver创建一个简单的集成测试。 这是一个恰巧启动浏览器的JUnit测试。

public class HelloWorldIntegrationTest {// The webdriverprivate static WebDriver driver;@BeforeClasspublic static void initWebDriver() {driver = new FirefoxDriver();}@AfterClasspublic static void stopSeleniumClent() {try {driver.close();driver.quit();} catch( Throwable t ) {// Catch error & log, not critical for testsSystem.err.println("Error stopping driver: "+t.getMessage());t.printStackTrace(System.err);}}@Testpublic void testHelloWorld() {// Start from the homepagedriver.get("http://localhost:9080/helloworld/");HomePage homePage = new HomePage(driver);HelloWorldPage helloWorldPage = homePage.clickMessageLink();assertEquals("Hello world",helloWorldPage.getMessage());}
}

第4-18行只是在测试之前启动Web驱动程序,并在测试完成后将其关闭(关闭浏览器窗口)。
在第22行,我们使用硬编码的URL导航到主页。
在第23行,我们初始化主页的Web Driver 页面对象 。 这封装了页面工作方式的所有细节,从而使测试可以与页面进行功能上的交互,而无需担心机制(使用哪些元素等)。 在第24行,我们使用主页对象单击“消息”链接; 这将导航到hello world页面。 在第25行,我们确认hello world页面上显示的消息是我们所期望的。 注意:我正在使用页面对象来将测试规范 (做什么)与测试实现 (如何做到)分开。 有关为什么这很重要的更多信息,请参见防止测试变脆 。

主页

主页对象非常简单:

public HelloWorldPage clickMessageLink() {driver.findElement(By.id("messageLink")).click();return new HelloWorldPage(driver);
}

HelloWorldPage

hello world页面同样简单:

public String getMessage() {return driver.findElement(By.id("message")).getText();
}

运行集成测试

要在我们的Maven构建过程中运行集成测试,我们需要进行一些更改。 首先,我们需要从单元测试阶段中排除集成测试:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId>...<configuration>...<excludes><exclude>**/*IntegrationTest.java</exclude><exclude>**/common/*</exclude></excludes></configuration>
</plugin>

然后,我们定义一个新的配置文件,因此我们可以选择运行集成测试:

<profile><id>with-integration-tests</id><build><plugins><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>6.1.22</version><configuration><scanIntervalSeconds>5</scanIntervalSeconds><stopPort>9966</stopPort><stopKey>foo</stopKey><connectors><connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"><port>9080</port><maxIdleTime>60000</maxIdleTime></connector></connectors></configuration><executions><execution><id>start-jetty</id><phase>pre-integration-test</phase><goals><goal>run</goal></goals><configuration><daemon>true</daemon></configuration></execution><execution><id>stop-jetty</id><phase>post-integration-test</phase><goals><goal>stop</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.5</version><inherited>true</inherited><executions><execution><id>integration-tests</id><phase>integration-test</phase><goals><goal>test</goal></goals><configuration><excludes><exclude>**/common/*</exclude></excludes><includes><include>**/*IntegrationTest.java</include></includes></configuration></execution></executions></plugin></plugins></build>
</profile>
<个人资料>

<id> with-integration-tests </ id>

<内部版本>

<插件>

<插件>

<groupId> org.mortbay.jetty </ groupId>

<artifactId> maven-jetty-plugin </ artifactId>

<version> 6.1.22 </ version>

<配置>

<scanIntervalSeconds> 5 </ scanIntervalSeconds>

<stopPort> 9966 </ stopPort>

<stopKey> foo </ stopKey>

<连接器>

<连接器实现=” org.mortbay.jetty.nio.SelectChannelConnector”>

<port> $ {test.server.port} </ port>

<maxIdleTime> 60000 </ maxIdleTime>

</ connector>

</ connectors>

</ configuration>

<执行>

<执行>

<id> start-jetty </ id>

<phase>集成前测试</ phase>

<目标>

<goal>运行</ goal>

</ goals>

<配置>

<daemon> true </ daemon>

</ configuration>

</ execution>

<执行>

<id>停止码头</ id>

<phase>集成后测试</ phase>

<目标>

<goal>停止</ goal>

</ goals>

</ execution>

</ executions>

</ plugin>

<插件>

<groupId> org.apache.maven.plugins </ groupId>

<artifactId> maven-surefire-plugin </ artifactId>

<version> 2.5 </ version>

<inherited> true </ inherited>

<执行>

<执行>

<id>集成测试</ id>

<phase>集成测试</ phase>

<目标>

<goal>测试</ goal>

</ goals>

<配置>

<排除>

<exclude> ** / common / * </ exclude>

</ excludes>

<包括>

<include> ** / * IntegrationTest.java </ include>

</ includes>

</ configuration>

</ execution>

</ executions>

</ plugin>

</ plugins>

</ build>

</ profile>

这可能看起来很复杂,但实际上我们只是在配置码头来运行我们的集成测试。 然后配置如何自行运行集成测试。
在9-19行中,配置码头-要继续运行的港口以及如何停止码头。
21-30行配置了码头,以在Maven构建的“集成前测试”阶段运行。 31-37行配置了要在Maven构建的“集成后测试”阶段停止的码头。 在第40-62行中,我们再次使用了maven-surefire-plugin,这次是在构建的“集成测试”阶段运行,仅运行我们的集成测试类。

我们可以使用以下命令运行此构建:

mvn clean install -Pwith-emma -Pwith-integration-tests

这将构建所有内容,运行单元测试,构建战争,启动码头进行战争,运行我们的集成测试(运行其余部分时,您将看到一个firefox窗口弹出),然后关闭码头。 由于战争是通过检测类构建的,因此在运行集成测试时,Emma还会跟踪代码覆盖率。

现在,我们可以构建应用程序,运行单元测试和集成测试,收集组合的代码覆盖率报告。 如果我们重新运行emma报告并检查代码覆盖率,我们现在将看到100%的测试覆盖率-因为控制器也通过测试覆盖。

问题

有哪些未解决的问题,可以做哪些进一步的扩展?

  • 该构建会生成一个已检测到的WAR –这意味着您需要运行第二个构建(没有emma)才能获得可用于生产的构建。
  • 集成测试对Jetty配置为启动的端口进行硬编码。 意味着测试不能直接在Eclipse中运行。 可以传入此端口,默认为8080,这样集成测试就可以通过maven构建在Eclipse中运行。
  • 在构建服务器上运行时,您可能不希望Firefox随机弹出(如果甚至安装了X)。 因此,运行xvfb是一个好主意。 可以将maven设置为在集成测试之前和之后启动和停止xvfb。

参考: 单元和集成测试的代码覆盖范围以及Actively Lazy博客的JCG合作伙伴 Dave提供的信息

相关文章 :
  • 任何软件开发公司应存在的服务,实践和工具,第1部分
  • 任何软件开发公司应存在的服务,实践和工具,第2部分
  • 这是在您的业务逻辑之前!
  • 您的代码中有几个错误?
  • 使用FindBugs产生更少的错误代码
  • Java工具:源代码优化和分析
  • 每个程序员都应该知道的事情
  • 为什么自动化测试可以提高您的开发速度

翻译自: https://www.javacodegeeks.com/2011/10/code-coverage-with-unit-integration.html

系统测试集成测试单元测试

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

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

相关文章

教你玩转CSS 媒体类型

目录 CSS 媒体类型 媒体类型 @media 规则 其他媒体类型 CSS 媒体类型 媒体类型允许你指定文件将如何在不同媒体呈现。该文件可以以不同的方式显示在屏幕上,在纸张上,或听觉浏览器等等。 媒体类型 一些 CSS 属性只设计了某些媒体。例如 voice-family 属性是专为听觉用户…

计算机盘符无法重命名,win8磁盘分区无法重命名怎么办

有些用户在使用Win8系统的过程中遇到C盘分区重命名的时候发生“无法修改名称”,那么win8磁盘分区无法重命名怎么办呢?下文学习啦小编就分享了解决win8磁盘分区无法重命名的方法&#xff0c;希望对大家有所帮助。win8磁盘分区无法重命名解决方法1、 按“WinR”输入“regedit”单…

泽泽计算机科技,《计算机与信息技术》大学技能学习丛书.pdf

计算机与信息技术魏巍摇周霖摇主编摇图书在版编目(悦陨孕)数据摇计算机与信息技术辕魏巍&#xff0c;周霖主编郾—北京&#xff1a;国防摇工业出版社&#xff0c;圆园园猿援苑摇(圆员世纪高新科技专业英语阅读系列)摇陨杂月晕苑原员员愿原园猿员员远原曾摇 郾计摇 郾 魏援援援 …

记一次CNVD通用漏洞审计

本文转载于&#xff1a;https://www.freebuf.com/articles/web/290697.html 0x01 前言写这篇文章的缘由其实还挺魔幻的&#xff0c;起因是在一次实战渗透时通过弱口令拿下一个低权限用户成功进入后台&#xff0c;在后台寻找功能点通过抓包分析&#xff0c;定位到目标系统后台存…

教你玩转CSS 属性选择器

目录 具有特定属性的HTML元素样式 属性选择器 属性和值选择器 属性和值的选择器 - 多值 表单样式 CSS 属性 选择器 具有特定属性的HTML元素样式 具有特定属性的HTML元素样式不仅仅是class和id。 注意:IE7和IE8需声明!DOCTYPE才支持属性选择器!IE6和更低的版本不支持属…

本地CDI限定词:@Any和@Default

让我们看一下CDI中的开箱即用的限定词 CDI规范声明了三个限定符– Any&#xff0c; Default&#xff0c; New Any &#xff1a;将其视为无所不在的限定词。 它在那里&#xff0c;即使不是;-) Default &#xff1a;顾名思义&#xff0c;当没有其他限定符是特定的时&#xff…

Oracle 关于事物的描述

事物在Oracle中的4种状态&#xff1a; commit--提交 rollback--全部回滚 savepoint name;--定义一个回滚到这里的点&#xff1a;例如&#xff1a;savepoint a; rollback to [savepoint]name--回滚到指定的点 例如 rollback to a;就回滚到a这个地方 例子&#xff1a; ----------…

简单CSS 总结

目录 CSS 总结 你已经学习了CSS,下一步学习什么呢? CSS 总结 本教程已向你讲解了如何创建样式表来同时控制多重页面的样式和布局。 你已经学会如何使用 CSS 来添加背景、格式化文本、以及格式化边框&#xff0c;并定义元素的填充和边距。 同时&#xff0c;你也学会了如何定…

计算机管理里边如何分盘,如何给电脑分盘【设置门径】

很多小伙伴都遇到过如何给电脑分盘的困惑吧&#xff0c;一些朋友看过网上零散的如何给电脑分盘的处理方法&#xff0c;并没有完完全全明白如何给电脑分盘是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照1&#xff1a;首先我们找到电脑里面的此电脑…

(九十三)蓝牙的基本使用

蓝牙在GameKit框架中实现&#xff0c;可以实现文件传递和游戏通信等&#xff0c;蓝牙的缺点是不能得到文件传输的进度&#xff0c;因此不宜传输大文件。 使用蓝牙的一般步骤如下&#xff1a; ①创建蓝牙设备拾取器&#xff0c;类似于图片拾取器&#xff0c;通过代理方法获取拾取…

电脑常识——host文件修改(屏蔽网站或解开屏蔽)

1. 什么是host文件&#xff1a; Hosts文件主要作用是定义IP地址和主机名的映射关系&#xff0c;是一个映射IP地址和主机名的规定。可以用文本文件打开&#xff01;当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应的IP地址&#xff…

面试提问vue中v-if与v-show的区别以及使用场景

目录 区别 使用场景 总结 区别 1.手段&#xff1a;v-if是通过控制dom节点的存在与否来控制元素的显隐&#xff1b;v-show是通过设置DOM元素的display样式&#xff0c;block为显示&#xff0c;none为隐藏&#xff1b;2.编译过程&#xff1a;v-if切换有一个局部编译/卸载的过程…

清华大学计算机系牛人,高考状元不靠加分靠实力

高考状元不靠加分靠实力来源&#xff1a;京华时报 2010-08-24英才档案 录取院校:清华大学计算机专业 毕业学校&#xff1a;河南省濮阳市油田第一中学 高考分数(理)&#xff1a;678分语文117数学135理综283英语143今年初清华大学举行的有三万余名考生参加的自主招生考试中&#…

Web常见漏洞描述及修复建议

1.SQL注入 漏洞描述 Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行&#xff0c;导致参数中的特殊字符破坏了SQL语句原有逻辑&#xff0c;攻击者可以利用该漏洞执行任意SQL语句&#xff0c;如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。…

glassfish_具有GlassFish和一致性的高性能JPA –第3部分

glassfish在我的四部分系列的第三部分中&#xff0c;我将说明将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存&#xff08;L2&#xff09;的全部内容。 一般的做法 这种方法将Coherence数据网格应用于依赖于数据库…

应广大粉丝的要求,推荐几本前端书籍

这些书籍平时会直接发送在主页的QQ技术群,有兴趣的可以加一下。 不想去培训机构,不想花大笔钱的学习,那就自学吧!接招

初中学习计算机基础,初中生计算机基础学习心得

导语&#xff1a;为了提高自身的计算机管理业务素质&#xff0c;促进信息技术教学工作的顺利开展&#xff0c;我于2017年3月份在中小学继续教育网上选学了《计算机应用基础》的课程学习。以下是小编为您收集整理提供到的范文&#xff0c;欢迎阅读参考&#xff0c;希望对你有所帮…

java的数据结构

本文转自互联网 1、二叉树&#xff1a;非线性数据结构&#xff0c;常被用于实现二叉查找树和二叉堆 二叉树的第i层至多有2的 i -1次方个结点&#xff1b;深度为k的二叉树至多有2^(k) -1个结点&#xff1b;对任何一棵二叉树T。 满二叉树 完全二叉树 平衡二叉树 2、 二叉树的遍历…

AssertJ的SoftAssertions –我们需要它们吗?

编写好的单元测试的规则之一是&#xff0c;它应该出于某种原因而失败&#xff0c;因此&#xff0c;单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则&#xff0c;我们可能在一个测试中每个对象具有多个断言。 但是&#xff0c;在单个测试中存…

早上起来CSDN的PC端主页积分变成了0

没有违法&#xff0c;没有乱纪&#xff0c;这是什么鬼&#xff1f;我刚才百度了一下&#xff0c;很多大牛都有类似的经历&#xff0c;心里舒服多了 平台BUG还是挺多的&#xff0c;说不准哪天就轮到你啦&#xff0c;哈哈&#xff01;&#xff01;