构建忽略测试
单元测试
单元测试是小型的(测试一个用例或一个单元),在内存中运行(不与数据库,消息队列等交互),可重复且快速的测试。 对于我们的对话,让我们将其限制为开发人员编写的基于JUnit的测试用例,以检查其各自的代码段。
整合测试
集成测试更大(测试一个流程或组件集成),不一定只在内存中运行(与数据库,文件系统,消息队列等交互),肯定较慢,并且不一定可重复(因为结果可能会更改)以防万一,例如在数据库中做了一些更改)。
为什么这种差异化很重要?
在敏捷编程中,基本概念之一是每隔一段时间(一天在开发人员盒中多次)运行单元测试,并强制集成测试每天运行一次(在连续集成服务器上而不是在开发人员盒上)。 。 请注意,开发人员应该能够在需要时运行集成测试,这仅仅是因为它与单元测试是分开的,因此,开发人员现在可以选择不在每次运行测试时都运行集成测试。
这种灵活性究竟有何帮助?
- 开发人员的构建频率更高。 在敏捷世界中,这意味着开发人员会更频繁地运行单元测试(每天通常运行几次)。
- 开发人员可以更快地了解错误,并减少浪费的时间来编码损坏的代码库。 这意味着节省时间和金钱。
- 修复错误更容易,更快。 考虑到构建的频率,可以提交较少数量的“违规代码”,因此更容易将bug归零并进行修复。
- 最后但并非最不重要的一点是,任何进行过任何专业编码的人都将证明,虽然偶尔可以休息10分钟有助于提高编码效率,但是没有什么比等待一个小时的构建更有效地杀死编码者的创造力了。 对士气的影响是无形的,但却是巨大的。
我到底该如何减少构建时间?
没有一个适合所有人的尺码(从来没有)。 缩短构建和发布时间的确切可执行步骤将是许多变量的因素,其中包括产品的技术堆栈(Java,DotNet,php),构建和发布技术(批处理文件,Ant,Maven)以及许多其他因素。
对于Java,Maven和JUnit组合……
让我们首先使用Maven创建一个简单的Java应用程序来演示这种情况。
\ MavenCommands.bat
ECHO OFF REM =============================
REM Set the env. variables.
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.3\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0REM =============================
REM Create a simple java application.
REM =============================
call mvn archetype:create ^-DarchetypeGroupId=org.apache.maven.archetypes ^-DgroupId=org.academy ^-DartifactId=app001
pause
如果运行此批处理文件,则将从为您准备好的标准Java应用程序开始。
默认的Java应用程序不附带最新的JUnit。 您可能想要更改Maven配置以添加最新的JUnit。
\ pom.xml
[...]4.10[...]junitjunit${junit.version}test
现在,继续并添加一个JUnit测试类。
/app001/src/test/java/org/academy/AppTest.java
public class AppTest {private final static Logger logger = LoggerFactory.getLogger(AppTest.class);@Test
public void smallAndFastUnitTest() {logger.debug("Quick unit test. It is not expected to interact with DB etc.");assertTrue(true);
}@Test
@Category(IntegrationTest.class)
public void longAndSlowIntegrationTest() {logger.debug("Time consuming integration test. It is expected to interact with DB etc.");assertTrue(true);
}
}
您可能会注意到有一个IntegrationTest.class标记。 您还必须创建此类。
/app001/src/test/java/org/academy/annotation/type/IntegrationTest.java
public interface IntegrationTest {// Just a marker interface.
}
创建标记接口并注释您的测试方法(或类,如果您愿意的话)是您在代码中要做的全部工作。
现在,剩下要做的就是告诉Maven仅在集成测试阶段运行“集成测试”。 这意味着开发人员在大多数情况下可以选择仅运行单元测试(与数据库,队列等隔离的快速测试)。 持续集成服务器(即Hudson(或类似产品))将运行单元测试和集成测试(由于预期它们将与数据库等交互,因此运行速度较慢),并且可能在一夜之间发生。
因此,这是您的操作方式。
/pom.xml
org.apache.maven.pluginsmaven-surefire-plugin2.12org.apache.maven.surefiresurefire-junit472.12-XX:-UseSplitVerifierorg.academy.annotation.type.IntegrationTest
这意味着开发人员只需使用一根衬管就可以运行所有单元测试。
mvn clean test
这将不会运行任何注释为集成测试的测试。
对于集成测试,请添加以下内容。
/pom.xml
maven-failsafe-plugin2.12org.apache.maven.surefiresurefire-junit472.12org.academy.annotation.type.IntegrationTestintegration-test**/*.class
这意味着哈德森或开发人员(如果他选择的话)可以通过一个命令来运行所有测试,单元和集成。
mvn clean verify
当然,如果您选择全部进行编译,运行单元测试,打包,运行集成测试和部署,那么也可以使用单行命令来完成。
mvn clean deploy
而已。 您已朝着更快的构建和更敏捷的工作方式迈出了一步。 快乐的编码。
进一步阅读
- 也可以通过Javalobby的此链接获得本文的一个版本-稍作编辑。
- 这是另一篇文章 ,涉及使用相同技术的类似主题。
参考:对 测试进行分类以减少构建时间。 从我们的JCG合作伙伴 Partho在Tech for Enterprise博客上获得。
翻译自: https://www.javacodegeeks.com/2012/07/categorize-tests-to-reduce-build-time.html
构建忽略测试