精华内容
下载资源
问答
  • Maven单元测试

    万次阅读 2018-01-11 10:32:09
    Maven单元测试, maven配置,使用单元测试

    Maven单元测试, maven配置,使用单元测试

    idea的terminal执行一个测试用例
    C:\Users\win\java\ideaIU-2019.3.3.win\plugins\maven\lib\maven3\bin\mvn -Dtest=com.controller.TestControllerTest#hi test
    
    展开全文
  • Maven 单元测试

    千次阅读 2018-03-04 00:29:11
    [INFO] Surefire report directory: /Users/pengxiaohe/private_project/common/maven-test/target/surefire-reports 2018-03-03T23:53:11+08:00 [INFO] Final Memory: 17M/306M [INFO] ...

    编写主代码

    public class HelloWorld {
    
        public String sayHello() {
            return "Hello Maven!";
        }
    
    }

    测试代码

    pom添加单元测试依赖:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.pengxiaohe</groupId>
        <artifactId>maven-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>

    上述pom代码中有一个值为test的元素scope,scope为依赖范围,若依赖范围为test则表示该依赖只对测试有效,换句话说,测试代码中import Junit代码是没有问题的,但是如果在主代码中用import Junit代码,就会造成编译错误。如果不声明依赖范围,默认值是compile,表示依赖对主代码和测试代码都有效。
    测试类:

    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class TestHelloWorld {
    
        @Test
        public void testSayHello() {
            HelloWorld helloWorld = new HelloWorld();
            String sayHelloRes = helloWorld.sayHello();
            assertEquals("Hello Maven!", sayHelloRes);
        }
    }

    一个典型的单元测试包含三个步骤:

    1. 准备测试类和测试数据
    2. 执行要测试的行为;
    3. 检查结果

    执行测试

    mvn clean test
    

    执行结果:

    [INFO] Scanning for projects…
    [INFO]
    [INFO] ————————————————————————
    [INFO] Building maven-test 1.0-SNAPSHOT
    [INFO] ————————————————————————
    [INFO]
    [INFO] — maven-clean-plugin:2.5:clean (default-clean) @ maven-test —
    [INFO] Deleting /Users/pengxiaohe/private_project/common/maven-test/target
    [INFO]
    [INFO] — maven-resources-plugin:2.6:resources (default-resources) @ maven-test —
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] Copying 0 resource
    [INFO]
    [INFO] — maven-compiler-plugin:3.1:compile (default-compile) @ maven-test —
    [INFO] Changes detected - recompiling the module!
    [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/pengxiaohe/private_project/common/maven-test/target/classes
    [INFO]
    [INFO] — maven-resources-plugin:2.6:testResources (default-testResources) @ maven-test —
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/pengxiaohe/private_project/common/maven-test/src/test/resources
    [INFO]
    [INFO] — maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-test —
    [INFO] Changes detected - recompiling the module!
    [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/pengxiaohe/private_project/common/maven-test/target/test-classes
    [INFO]
    [INFO] — maven-surefire-plugin:2.12.4:test (default-test) @ maven-test —

    [INFO] Surefire report directory: /Users/pengxiaohe/private_project/common/maven-test/target/surefire-reports

    T E S T S

    ——————————————————- Running com.pizi.helloworld.TestHelloWorld Tests run: 1, Failures: 0, Errors:
    0, Skipped: 0, Time elapsed: 0.06 sec

    Results :

    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

    [INFO]
    ———————————————————————— [INFO] BUILD SUCCESS [INFO]
    ———————————————————————— [INFO] Total time: 1.558 s [INFO] Finished at:

    2018-03-03T23:53:11+08:00 [INFO] Final Memory: 17M/306M [INFO]

    Maven在执行测试之前,它会先执行项目的主资源管理,主代码编译,测试资源管理、测试代码编译等工作,这是maven生命周期的一个特性。

    展开全文
  • maven单元测试

    2013-11-07 17:02:57
    Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit ...

    1.maven-surefire-plugin简介

    Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。

    在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:

    • **/Test*.java:任何子目录下所有命名以Test开关的Java类。
    • **/*Test.java:任何子目录下所有命名以Test结尾的Java类。
    • **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。

    2.跳过测试

    要想跳过测试,在命令行加入参数skipTests就可以了。如:
    Plain代码
    1. mvn package -DskipTests  

    也可以在pom配置中提供该属性。
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugins</groupId>  
    3.     <artifactId>maven-surefire-plugin</artifactId>  
    4.     <version>2.5</version>  
    5.     <configuration>  
    6.         <skipTests>true</skipTests>  
    7.     </configuration>  
    8. </plugin>  

    有时候可能不仅仅需要跳过测试运行,还要跳过测试代码的编译:
    Plain代码
    1. mvn package -Dmaven.test.skip=true  

    也可以在pom中配置maven.test.skip:
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugin</groupId>  
    3.     <artifactId>maven-compiler-plugin</artifactId>  
    4.     <version>2.1</version>  
    5.     <configuration>  
    6.         <skip>true</skip>  
    7.     </configuration>  
    8. </plugin>  
    9. <plugin>  
    10.     <groupId>org.apache.maven.plugins</groupId>  
    11.     <artifactId>maven-surefire-plugin</artifactId>  
    12.     <version>2.5</version>  
    13.     <configuration>  
    14.         <skip>true</skip>  
    15.     </configuration>  
    16. </plugin>  

    3.动态指定要运行的测试用例

    maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。如:
    Plain代码
    1. mvn test -Dtest=RandomGeneratorTest  

    也可以使用通配符:
    Plain代码
    1. mvn test -Dtest=Random*Test  

    或者也可以使用“,”号指定多个测试类:
    Plain代码
    1. mvn test -Dtest=Random*Test,AccountCaptchaServiceTest  

    如果没有指定测试类,那么会报错并导致构建失败。
    Plain代码
    1. mvn test -Dtest  

    这时候可以添加-DfailIfNoTests=false参数告诉maven-surefire-plugin即使没有任何测试也不要报错。
    Plain代码
    1. mvn test -Dtest -DfailIfNoTests=false  

    由此可见,命令行参数-Dtest -DfailIfNoTests=false是另外一种路过测试的方法

    4.包含与排除测试用例

    如果由于历史原因,测试类不符合默认的三种命名模式,可以通过pom.xml设置maven-surefire-plugin插件添加命名模式或排除一些命名模式。
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugins</groupId>  
    3.     <artifactId>maven-surefire-plugin</artifactId>  
    4.     <version>2.5</version>  
    5.     <configuration>  
    6.         <includes>  
    7.             <include>**/*Tests.java</include>  
    8.         </includes>  
    9.         <excludes>  
    10.             <exclude>**/*ServiceTest.java</exclude>  
    11.             <exclude>**/TempDaoTest.java</exclude>  
    12.         </excludes>  
    13.     </configuration>  
    14. </plugin>  

    5.生成测试报告

    5.1基本测试报告

    默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告。
    • 简单文本格式——内容十分简单,可以看出哪个测试项出错。
    • 与JUnit兼容的XML格式——XML格式已经成为了Java单元测试报告的事实标准,这个文件可以用其他的工具如IDE来查看。

    5.2测试覆盖率报告

    测试覆盖率是衡量项目代码质量的一个重要的参考指标。Cobertura是一个优秀的开源测试覆盖率统计工具(详见http://cobertura.sourceforge.net/),Maven通过cobertura-maven-plugin与之集成,用户可以使用简单的命令为Maven项目生成测试覆盖率报告。运行下面命令生成报告:
    Plain代码
    1. mvn cobertura:cobertura  

    6.运行TestNG测试

    TestNG是Java社区中除了JUnit之外另一个流行的单元测试框架。TestNG在JUnit的基础上增加了很多特性,其站点是http://testng.org/.添加TestNG依赖:
    Html代码
    1. <dependency>  
    2.     <groupId>org.testng</groupId>  
    3.     <artifactId>testng</artifactId>  
    4.     <version>5.9</version>  
    5.     <scope>test</scope>  
    6.     <classifier>jdk15</classifier>  
    7. </dependency>  

    下面是JUnit和TestNG的常用类库对应关系
    JUnit类 TestNG类 作用
    org.junit.Test org.testng.annotations.Test 标注方法为测试方法
    org.junit.Assert org.testng.Assert 检查测试结果
    org.junit.Before org.testng.annotations.BeforeMethod 标注方法在每个测试方法之前运行
    org.junit.After org.testng.annotations.AfterMethod 标注方法在每个测试方法之后运行
    org.junit.BeforeClass org.testng.annotations.BeforeClass 标注方法在所有测试方法之前运行
    org.junit.AfterClass org.testng.annotations.AfterClass 标注方法在所有测试方法之后运行

    TestNG允许用户使用一个名为testng.xml的文件来配置想要运行的测试集合。如在类路径上添加testng.xml文件,配置只运行RandomGeneratorTest
    Html代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <suite name="Suite1" verbose="1">  
    3.     <test name="Regression1">  
    4.         <classes>  
    5.             <class name="com.juvenxu.mvnbook.account.captcha.RandomGeneratorTest" />  
    6.         </classes>  
    7.     </test>  
    8. </suite>  

    同时再配置maven-surefire-plugin使用该testng.xml,如:
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugins</groupId>  
    3.     <artifactId>maven-surefire-plugin</artifactId>  
    4.     <version>2.5</version>  
    5.     <configuration>  
    6.         <suiteXmlFiles>  
    7.             <suiteXmlFile>testng.xml</suiteXmlFile>  
    8.         </suiteXmlFiles>  
    9.     </configuration>  
    10. </plugin>  

    TestNG较JUnit的一大优势在于它支持测试组的概念。如可以在方法级别声明测试组:
    Java代码
    1. @Test(groups={"util","medium"})  

    然后可以在pom中配置运行一个或多个测试组:
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugins</groupId>  
    3.     <artifactId>maven-surefire-plugin</artifactId>  
    4.     <version>2.5</version>  
    5.     <configuration>  
    6.         <groups>util,medium</groups>  
    7.     </configuration>  
    8. </plugin>  

    7.重用测试代码

    当命令行运行mvn package的时候,Maven只会打包主代码及资源文件,并不会对测试代码打包。如果测试代码中有需要重用的代码,这时候就需要对测试代码打包了。
    这时候需要配置maven-jar-plugin将测试类打包,如:
    Html代码
    1. <plugin>  
    2.     <groupId>org.apache.maven.plugins</groupId>  
    3.     <artifactId>maven-jar-plugin</artifactId>  
    4.     <version>2.2</version>  
    5.     <executions>  
    6.         <execution>  
    7.             <goals>  
    8.                 <goal>test-jar</goal>  
    9.             </goals>  
    10.         </execution>  
    11.     </executions>  
    12. </plugin>  
    maven-jar-plugin有两个目标,分别为jar和test-jar。这两个目标都默认绑定到default生命周期的package阶段运行,只是test-jar并没有在超级POM中配置,因此需要我们另外在pom中配置。

    现在如要引用test-jar生成的测试代码包,可以如下配置:
    Html代码
    1. <dependency>  
    2.     <groupId>com.juvenxu.mvnbook.account</groupId>  
    3.     <artifactId>account-captcha</artifactId>  
    4.     <version>1.0.0-SNAPSHOT</version>  
    5.     <type>test-jar</type>  
    6.     <scope>test</scope>  
    7. </dependency>  

    展开全文
  • maven 单元测试并行 大约是时候单元测试的开发人员能够使用批注在Parallel中运行测试。 在今天的博客文章中,我们将介绍如何使用Easytest提供的注释使传统的Junit测试并行运行。 易测 是在JUnit之上构建的测试框架...

    maven 单元测试并行

    大约是时候单元测试的开发人员能够使用批注在Parallel中运行测试。 在今天的博客文章中,我们将介绍如何使用Easytest提供的注释使传统的Junit测试并行运行。 易测 是在JUnit之上构建的测试框架,可让您轻松编写和维护测试。 它专注于为您的应用程序编写数据驱动测试。

    让我们首先假设一个类ItemService具有方法2的方法:

    1. 带有2个参数Double itemId和String itemType的getItems。 API类如下所述。
    2. updateItem接受一个I​​tem实例并在数据库中对其进行更新。
    public class ItemService {
    
       public List getItems (Double itemId , String itemType);
    
       public void updateItem (Item item);
    
    }

    为了简化示例,我们将省略实现。

    让我们看一下编写并行单元测试的分步方法。

    第1步:

    Maven Central Repository下载EasyTest的最新版本(或1.2或更高版本)

    第2步:

    接下来,让我们使用EasyTest批注和数据驱动的测试方法为上述业务方法编写一个简单的单元测试。

    @RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths="getItemData.csv")
    @TestConfigProvider(TestConfigProvider.class)
    public class ItemServiceTest {
    
         @Inject
         private ItemService itemService;
    
         @Before
         public void before() {
             System.out.println("BEFORE");
         }
    
         @Test
         public List testGetItems(@Param(name="itemId")Double itemId , @Param(name="itemType")String itemType) {
           
              //Actual test conditions here
               System.out.println("Run testGetItems");
    
         }
    
         @Test
         public void testUpdateItem(@Param(name="item") Item item) {
           
              //Actual test conditions here
              System.out.println("Run testUpdateItem");
    
         }
    
        @After
         public void after() {
             System.out.println("AFTER");
         }
    }

    上面的示例使用EasyTest的现有功能,例如在测试文件中提供数据,并使用CDI批注注入测试bean。 如果您想了解有关EasyTest中的@TestConfigProvider和依赖注入的更多信息,请参见我以前的博客文章。 如果您想进一步了解如何使用EasyTest编写数据驱动测试,可以访问EasyTest的WIKI Pages

    现在,上面是运行简单的数据驱动单元测试的示例。 以上所有测试将依次进行串行测试。 假设每种测试方法在getItemData.csv文件中指定了两组测试数据,则在运行上述测试时,我们将在控制台上获得以下内容:

    BEFORE
    Run testGetItems
    AFTER
    
    BEFORE
    Run testGetItems
    AFTER
    
    BEFORE
    Run testUpdateItem
    AFTER
    
    BEFORE
    Run testUpdateItem
    AFTER

    步骤3:

    接下来,让上述测试并行运行。 只需在类级别包含@Parallel批注,并提供要运行的线程数。 对于上述测试用例,我们将运行两个线程。

    @RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths="getItemData.csv")
    @TestConfigProvider(TestConfigProvider.class)
    @Parallel(threads=2)
    public class ItemServiceTest {
    
         @Inject
         private ItemService itemService;
    
         @Before
         public void before() {
             System.out.println("BEFORE");
         }
    
         @Test
         public List testGetItems(@Param(name="itemId")Double itemId , @Param(name="itemType")String itemType) {
           
              //Actual test conditions here
               System.out.println("Run testGetItems");
    
         }
    
         @Test
         public void testUpdateItem(@Param(name="item") Item item) {
           
              //Actual test conditions here
              System.out.println("Run testUpdateItem");
    
         }
    
        @After
         public void after() {
             System.out.println("AFTER");
         }
    }

    注意lass级别的@Parallel批注。

    运行该测试时,控制台输出看起来像这样(运行相同的测试时可能会有所不同):

    BEFORE
    BEFORE
    Run testGetItems
    BEFORE
    Run testUpdateItem
    AFTER
    Run testGetItems
    BEFORE
    AFTER
    Run testUpdateItem
    AFTER
    AFTER

    从上面的控制台输出中可以看到,测试是同时运行的,这就是为什么看到这样的分布式控制台输出的原因。

    结论

    在上面的示例中,我们看到了如何在Parallel中运行测试。 同样,当使用Maven等构建工具构建测试时,这些测试将并行运行。 这对您具有成千上万的单元测试并且它们需要几分钟的运行时间的场景有很大的帮助。

    EasyTest正在使用命令行/系统参数方法来启用/禁用并行功能。 敬请关注。

    参考: JavaWorld Blog博客上的JCG合作伙伴 Anuj Kumar 并行运行单元测试

    翻译自: https://www.javacodegeeks.com/2013/07/run-your-unit-tests-in-parallel.html

    maven 单元测试并行

    展开全文
  • 背景 环境需要设置代理才能够访问外部网络,如果只是运行java程序来访问网络,我们可以通过java -jar test.jar -DproxyHost=proxy_ip -DproxyPort=proxy_port,但如果... 解决 Maven单元测试,使用的是Surefire Maven
  • maven单元测试报java lang IllegalStateException Failed to load Ap
  • 第一篇:Scala Scalatest Maven 单元测试配置(测试报告和覆盖率报告) 第二篇:Scala Scalatest Maven 集成测试配置 环境: Maven: 3.3.9 Scala: 2.11.11 Scalatest_2.11: 3.0.1 这次配置单元测试没有使用...
  • IDEA创建maven单元测试

    2019-09-10 00:39:57
    新建一个类以后,将光标定位在类名上面,悬停大概5秒,会出现一个灯泡状图标,点击图标,就可以迅速创建单元测试 创建单元测试的时候要注意,testing library要选择JUnit(3还是4还是5,看安装的版本),还要选择...
  • maven单元测试插件:maven-surefire-plugin

    万次阅读 2018-01-23 08:32:44
    Maven通过Maven Surefire Plugin插件执行单元测试。(通过Maven Failsafe Plugin插件执行集成测试)在pom.xml中配置JUnit,TestNG测试框架的依赖,即可自动识别和运行src/test目录下利用该框架编写的测试用例。...
  • 使用maven单元测试时报错: java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:157) at org.junit.runners.BlockJUnit4...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,095
精华内容 1,638
关键字:

maven单元测试