精华内容
下载资源
问答
  • 作为一名程序员,在开发过程中,经常需要面对不同运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同环境中,相关配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行...

    尊重原创: 原文地址:http://www.cnblogs.com/lzxianren/p/maven-profile.html 


    作为一名程序员,在开发的过程中,经常需要面对不同的运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置。每次在不同环境部署程序时,都需要修改相应的配置文件,使之完成环境的配置。这么做存在一个比较大的问题:每次修改配置非常麻烦,而且配置错误会产生不可预估的影响,比如,在发布生产环境时用的开发环境的配置还好,但如果在开发环境下用生产环境的数据,将会造成生产数据的污染,导致生产环境崩溃。

    目前JAVA相关的项目基本都是使用Maven来进行构建。在maven中实现多环境的构建可移植性需要使用profile,通过不同的环境激活不同的profile来达到构建的可移植性。

    一、POM中profile的配置

    首先是profile配置,在pom.xml中添加如下profile的配置:

    <profiles>
        <profile>
            <!-- 本地开发环境 -->
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 测试环境 -->
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
        <profile>
            <!-- 生产环境 -->
            <id>pro</id>
            <properties>
                <profiles.active>pro</profiles.active>
            </properties>
        </profile>
    </profiles>
    

    这里定义了三个环境,dev(开发环境)、test(测试环境)、pro(生产环境),其中开发环境是默认激活的(activeByDefault为true),这样如果在不指定profile时默认是开发环境。

    同时每个profile还定义了两个属性,其中profiles.active表示被激活的profile的配置文件的目录。

    二、工程目录

    针对不同的环境,我们定义不同的配置文件,而这些配置文件都做为资源文件放到maven工程的resources目录下,即src/main/resources目录下,且各个环境的配置分别放到相应的目录下,而所有环境都公用的配置,直接放到src/main/resources目录下即可。如下图所示:
    目录结构

    如图所示,开发环境、测试环境、生产环境的配置文件分别放到src/main/resources目录下的dev、test、pro三个子目录中,剩余公共的配置文件放于resources目录下。

    三、POM文件中build配置

    在pom中的build节点下,配置资源文件的位置,如下所示:

        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <!-- 资源根目录排除各环境的配置,防止在生成目录中多余其它目录 -->
                    <excludes>
                        <exclude>test/*</exclude>
                        <exclude>pro/*</exclude>
                        <exclude>dev/*</exclude>
                    </excludes>
                </resource>
                <resource>
                    <directory>src/main/resources/${profiles.active}</directory>
                </resource>
            </resources>
        </build>

    首先第一个资源文件位置src/main/resources需要排队提各个环境的配置文件,各个环境的配置我们在第二个节点中通过前面在profile中配置的profiles.active属性来指定。即src/main/resources/${profiles.active}。这样在激活指定的profile时,会加载指定目录下的配置文件,如当前激活的是pro profile,那么这个资源目录就是src/main/resources/pro。这样就达到了不同环境加载不同配置的目的。

    五、项目编译生成

    所有需要的配置就完成了,通过在运行maven命令时指定不同的profile即可构建不同环境需要的war包或发布到不同的环境了 。如:

    mvn clean package -Ppro即构建出生产环境需要的war包

    由于默认的profile是dev,所以如果我们不指定profile,那么加载就是开发环境dev下的配置文件了。即我们在本地开发测试时,不用关心profile的问题。

    其它方法

    在resource节点中可以增加如下节点

    <resource>
        <directory>src/main/resources</directory>
        <!-- 资源根目录排除各环境的配置,使用单独的资源目录来指定 -->
        <excludes>
            <exclude>test/*</exclude>
            <exclude>pro/*</exclude>
            <exclude>dev/*</exclude>
        </excludes>
        <filtering>true</filtering>
    </resource>
    

    在某个resource中如果设置filtering为true,将会根据输入参数动态修改相关内容。

    配置文件app.config中为

    url=${url}

    方式一,使用profile的properties

    <properties>
        <profiles.active>test</profiles.active>
        <url>localhost</url>
    </properties>

    maven在resources过程中会替换为localhost

    方式二,使用命令参数-D

    mvn clean package -Durl=localhost

    同样的效果,都会copy资源文件的时候设置这个url的参数

    参考链接

    http://maven.apache.org/guides/introduction/introduction-to-profiles.html
    http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/

    http://blog.csdn.net/mhmyqn/article/details/24501281


    展开全文
  • 一个用于Eclipse RCP应用程序(例如Virtual Satellite)的Maven Tycho演示项目。 项目状态 状态 用于开发构建。 状态 用于集成构建。 状态 为大师建造。 目的 该项目是使虚拟卫星开源的测试设置。 它有助于将软件...
  • 流水线上的AI单元测试MAVEN) 持续集成就是不断地将代码仓库各种分支合并到主干的过程,在持续...单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测

    流水线上的AI单元测试(MAVEN)

    持续集成就是不断地将代码仓库各种分支合并到主干的过程,在持续集成过程中的卡点设置除去team内部的code review、SonarQube的代码扫描还有就是单元测试。

    单元测试是什么

    单元测试就是对软件中最小可测单元进行的检查和验证。这个最小可测单元有可能是指C语言中的一个函数,有可能是Java的一个类。这也就是所有的单元就是认为规定的一种最小的被测试单元。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

    一般来说,绝大部分team将单元测试看做java类的一个function、C++的一个函数、python的一个函数等这种可以被调用并且可以独立运行的一段逻辑单元。这也就说明了单元测试也是需要测试用例的,那么如何算是一个测试用例呢(引自:IEEE Standard 610 (1990)):

    A set of test inputs , execution conditions , and expected results developed for a particular objective , such as to exercise a particular program path or to verify compliance with a specific requirement . ( IEEE Std 829 - 1983 ) Documentation specifying inputs , predicted results , and a set of execution conditions for a test item .
    

    MAVEN和单元测试

    我们在使用maven进行java项目的构建过程中,会看到maven有各式各样的命令,其中常用的包含了:

    • mvn clean:清理项目的target目录
    • mvn compile:编译项目
    • mvn test:编译项目后,再执行Junit测试方法
    • mvn package:编译项目后,再执行Junit测试方法,再把项目打包到target目录(其包含了mvn complie、mvn test两步)
    • mvn install:编译项目后,再执行Junit测试方法,再把项目打包到target目录,再安装到本地仓库。(也就是包含了mvn complie、mvn test、mvn package三步)

    那么也就是说如果我们在某一个项目中执行了mvn package或则mvn install,那么必定会执行mvn complie和mvn test(如果在test目录下没有单元测试脚本,那么test会被skip)

    Evosuite智能化单元测试框架的使用

    EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。得到了Google和Yourkit的支持。

    EvoSuite提供了4找那个引入模式,每一种都可以达到生成单元测试用例(基于Junit4的测试脚本)的效果:

    第一种:jar包独立运行

    首先需要下载evosuite独立运行的jar包,evosuite-1.0.6.jar

    然后,在命令行输入:

    java -jar evosuite.jar <options>
    

    其中options如下:

    * EvoSuite 1.0.
    
    usage: EvoSuite     
    
    -base_dir <arg>             Working directory in which tests and reports  will be placed  
    
    -class <arg>               target class for test generation. A fully  qualifying needs to be provided, e.g. org.foo.SomeClass  
    
    -continuous <arg>          Run Continuous Test Generation (CTG). Valid values are: [EXECUTE, INFO, CLEAN]
    
    -criterion <arg>           target criterion for test generation. Can define more than one criterion by using a ':' separated list
    
    -D <property=value>        use value for given property
    
    -evosuiteCP <arg>          classpath of EvoSuite jar file(s). This is needed when EvoSuite is called in plugins like Eclipse/Maven
    -generateMOSuite           use many objective test generation (MOSA).
    -generateNumRandom <arg>   generate fixed number of random tests
    -generateRandom            use random test generation
    -generateSuite             use whole suite generation. This is the
                                default behavior
    -generateSuiteUsingDSE     use Dynamic Symbolic Execution to generate test suite
    -generateTests             use individual test generatio(old approach for reference purposes)
    -heapdump                  Create heap dump on client VM out of memory error
    -help                      print this message
    -inheritanceTree           Cache inheritance tree during setup
    -junit <arg>               junit prefix
    -libraryPath <arg>         java library path to native libraries of the project under test
    -listClasses               list the testable classes found in the specified classpath/prefix
    -listParameters            list all the parameters that can be set with -D
    -measureCoverage           measure coverage on existing test cases
    -mem <arg>                 heap size for client process (in megabytes)
    -prefix <arg>              target package prefix for test generation. All classes on the classpath with the given package prefix will be used, i.e. all classes in the given package and sub-packages.
    
    -printStats                print class information(coverable goals)
    -projectCP <arg>           classpath of the project under test and all
                                its dependencies
    -regressionSuite           generate a regression test suite
    -regressionTests           generate a regression test suite of individual tests
    -seed <arg>                seed for random number generator
    -setup <arg>               Create evosuite-files with property file
    -startedByCtg              Determine if current process was started by a CTG process
    -target <arg>              target classpath for test generation. Either a jar file or a folder where to find the .class files
    -writeDependencies <arg>   write the dependencies of a target class to file
    

    第二种和第三种:eclipse和inteljIDEA的插件

    evosuite针对目前比较流行的eclipse和inteljIdea提供了插件,具体使用方法大家去看官网就好了这里不再详细介绍了。

    第四种:maven的支持

    当前支持Maven3.1以上版本。
    Maven工程可以通过引入EvoSuite的Maven插件来生成新的测试用例。使用Maven插件有如下好处:

    • 1、可以和Jenkins结合,方便快速的运行EvoSuite

    • 2、测试用例生成在pom.xml文件约定好的工程目录下

    • 3、通过Maven的依赖引入EvoSuite,无需单独下载独立的jar文件。

    需要在要使用的module的pom.xml文件中引入如下几部分:

    properties:

        <properties>
             <evosuiteVersion>1.0.6</evosuiteVersion>
        </properties>
    

    dependencies

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.evosuite</groupId>
            <artifactId>evosuite-standalone-runtime</artifactId>
            <version>${evosuiteVersion}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit4</artifactId>
            <version>2.19</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <version>3.0.0-M3</version>
        </dependency>
    </dependencies>
    

    build下的plugins中

    <build>
        <plugins>
            <plugin>
                <groupId>org.evosuite.plugins</groupId>
                <artifactId>evosuite-maven-plugin</artifactId>
                <version>1.0.6</version>
                <executions><execution>
                    <goals> <goal> prepare </goal> </goals>
                    <phase> process-test-classes </phase>
                </execution></executions>
            </plugin>
    
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <instrumentation>
                        <ignores>
                            <ignore>com.example.boringcode.*</ignore>
                        </ignores>
                        <excludes>
                            <exclude>com/example/dullcode/**/*.class</exclude>
                            <exclude>com/example/**/*Test.class</exclude>
                        </excludes>
                    </instrumentation>
                    <formats>
                            <format>html</format>
                            <format>xml</format>
                        </formats>
                    <check/>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- mvn test生成xml txt测试报告(命令行不带surefire-report:report时) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <configuration>
                    <skipTests>false</skipTests>
                    <testFailureIgnore>true</testFailureIgnore> <!--  -->
                    
                    <includes>
                        <include>**/*Test.java</include>    <!--  -->
                    </includes>
                    <excludes>
                        <!-- -->
                    </excludes>
                </configuration>
            </plugin>
    
            <!-- 用mvn ant生成格式更友好的report -->
            <plugin>
                <groupId>org.jvnet.maven-antrun-extended-plugin</groupId>
                <artifactId>maven-antrun-extended-plugin</artifactId>   <!--  -->
                <version>1.43</version>
                <executions>
                    <execution>
                        <id>test-reports</id>
                        <phase>test</phase> <!--  -->
                        <configuration>
                            <tasks>
                                <junitreport todir="${basedir}/target/surefire-reports">
                                    <fileset dir="${basedir}/target/surefire-reports">
                                        <include name="**/*.xml" />
                                    </fileset>
                                    <report format="frames" todir="${basedir}/target/surefire-reports" /> <!--  -->
                                </junitreport>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant-junit</artifactId>
                        <version>1.8.0</version>
                    </dependency>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant-trax</artifactId>
                        <version>1.8.0</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    project

    <project>
        <reporting>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>cobertura-maven-plugin</artifactId>
                    <version>2.7</version>
                </plugin>
            </plugins>
        </reporting>
    </project>
    

    流水线和智能化测试框架EvoSuite的结合

    在jenkins中如何配置使用EvoSuite呢?首先在前面我们已经说过了EvoSuite要在module的pom.xml文件中配置,那么我们以一个简单的例子开始,例子中有一个module名字为spring-boot-docker,那么我们需要在jenkins的pre steps里面配置一个顶层maven目标的步骤,在Maven版本中输入MAVEN_HOME,在目标中写入:evosuite:generate evosuite:export(其中evosuite:generate是生成单元测试脚本,evosuite:export将产生的单元测试脚本移动到test文件夹)。在POM文件中写入spring-boot-docker的pom.xml文件的相对路径如下:

    然后再次添加一个调用顶层Maven目标的步骤,在MAVEN版本中输入MAVEN_HOME,在目标中输入package:

    犹如前面所说,mvn package包含了mvn complie和mvn test,mvn test会运行已经通过mvn evosuite:export放入test目录的单元测试脚本,这样就完成了自动生产测试用例自动运行单元测试的流程。

    Evosuite的一些坑以及如何屏蔽

    巨型函数

    相信,很多人都不知道Java的Method的上限为64K。本文将超过这个上限的函数叫做巨型函数。

    巨型函数的问题

    1、如果代码超过了这个限制,Java编译器就报"Code too large to complier"的错误。
    2、代码并没有超过64K的限制,但是在运行时由于其他工具或者library使得对应的代码超过了64K的限制,那么Java会给我们一个java.lang.VerifyError的错误。

    巨型函数的由来

    如下一些仅仅是一些可能导致出现巨型函数的常见情况,还有很多其他情况就不一一列举了。

    • 一些工具生成的代码:很多大函数并不是人手动写出来的,是一些代码生成工具生成的,例如ANTLR(ANother Tool for language Recognition)就有可能生成巨大的Method。

    • 初始化函数:Initialization方法就很容易变成巨型函数,尤其是一些GUI的初始化函数,很容易在一个代码段中塞进去很多对应的GUI的布局定义代码和attaching listener代码,导致巨型函数的产生。

    • 数组初始化:测者在工作中也遇见过static final 数组编译器使用load或者sotre的指令初始化数组。这有时候也会导致出现巨型函数。

    • 很长的JSP页面:很多JSP的编译器也会将所有的JSP代码编译到一个函数中,导致巨型函数的出现。

    如何解决巨型函数的问题

    从上面可以看出,EvoSuite在生成测试用例的时候由于会调用起自己的字节码机制,因此有可能会触发这个巨型函数缺陷,导致jvm报错最后无case生成。针对这个问题最好也是最根本的解决巨型函数的方法就是拆分。无论是代码生成工具还是JSP都允许我们进行代码的拆分。但是其他一些例如调用第三方工具或者library导致的这个问题,很多时候就不能通过粗暴的代码拆分解决问题了,需要重新设计,优化算法等方式避免巨型函数的出现。也有很多时候我们没有办法避免巨型函数的64K限制,我们最终的根本方法还是寄希望于Java自身接触64K的限制。

    Jacoco的代码覆盖率是0

    EvoSuite的bytecode instrumentation和类似Jacoco这类工具在bytecode instrumentation上有可能有冲突,导致最后的覆盖率统计都是0

    bytecode instrumentation是改变了编译器上生成的一个类的bytecode,用它可以完成如:计算一个方法被执行需要多长时间、改变它的执行流程等特别的流程。用户可以添加/改变应用程序的字节码,自从有了这个功能后,就不需要修改整个应用程序源。

    EvoSuite的字节码检测机制

    在EvoSuite的bytecode instrumentation有两种选择如下:

    • 其一、在EvoSuite的 @RunWith(EvoRunner.class)中,会调用EvoSuite自己的classloader,而在这个过程中就调用它自己提供的bytecode instrumentation来完成对应的分析。这就导致了EvoSuite的bytecode instrumentation是早于其他代码覆盖工具完成。

    • 其二、EvoSuite会启动一个Java的代理,代理会拦截全部的class loading,然后加入其EvoSuie的bytecode instrumentation。

    EvoSuite目前默认是第一种,但是如果可以使用第二种,测者建议使用第二种,因为第二种可以有效避免和类似Jacoco工具的bytecode instrumentation的冲突,但是如果在测试在代理启动前就执行了,那么就不会起作用了范围会报EvoSuite的错误。

    在使用过程中,如果发现代码覆盖报告全部是0,可以尝试通过一下方式切换上面的两种bytecode instrumentation方式。

    @RunWith(EvoRunner.class) @EvoRunnerParameters(mockJVMNonDeterminism = true, useVFS = true, useVNET = true, resetStaticState = true, separateClassLoader = true, useJEE = true)
    

    修改separateClassLoader = true为false(从方式1 变成方式2),如果一切自效果,那么可以再Maven的pom中加入对应的配置:

    <configuration>
    
    <extraArgs> -Duse_separate_classloader=false </extraArgs>
    
    </configuration>
    

    EvoSuite的TooManyResourceException问题的处理

    在使用EvoSuite的时候有时候会出现一个TooManyResourceException的问题,具体报错如下:

    Exception:
    Caused by: org.evosuite.runtime.TooManyResourcesException: Loop has been executed more times than the allowed 10000
    at org.evosuite.runtime.LoopCounter.checkLoop(LoopCounter.java:115)
    at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.skipSpaces(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
    at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:137)
    at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:115)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory.parse(Unknown Source)
    at org.apache.poi.xssf.model.StylesTable.readFrom(StylesTable.java:203)
    at org.apache.poi.xssf.model.StylesTable.(StylesTable.java:146)
    

    分析和修订:所有的EvoSuite生成的单元测试class都继承自一个同名的scaffolding的类,在对应的脚手架后缀名的类中的@BeforeClass部分,有一个参数:

    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop=10000;
    

    上述报错就是因为这一项的设置造成的。那么该org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop是干什么的呢?这里我们就要进入EvoSuite的源代码里面看看了。经过源代码分析,在源代码中:

    evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java
    

    发现其110行到123行部分能够抛出对应的异常,依据作者注释,该类就是为了避免无限循环的出现而专门做的一个循环计数的类。通过源代码的异常抛出位置可以看出就是一位代码执行的循环次数超过了10000而抛出的异常,这么大次数的循环有可能是mock的数据导致的,也有可能是内部脚本逻辑异常导致的。

    解决该问题:通过对应github项目的查找发现这不是一个fixed的issue。但是可以通过设置该参数避免该异常出现。
    通过maxNumberOfIterationPerLoop出现的条件部分的判断,evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java的96到98行,如下:

    if(RuntimeSettings.maxNumberOfIterationsPerLoop < 0){
            return; //do nothing, no check
        }
    

    和/Users/chancriss/Desktop/WorkSpace/JavaSpace/github/evosuite/runtime/src/main/java/org/evosuite/runtime/instrumentation/RuntimeInstrumentation.java下的144行到146行,如下:

    if (RuntimeSettings.maxNumberOfIterationsPerLoop >= 0) {
    		cv = new LoopCounterClassAdapter(cv);
    	}
    

    可知,要避免这类问题的出现,并不是在对应的JUnit脚本的父类中扩大org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop的值,而是将其设置成为一个小于0的值。

    EvoSuite的架构说明

    EvoSuite是一个C/S结构的框架,这样会保证即使Server端出现crash的时候,我们还是可以保留已经生成的单元测试用。EvoSuite引入了mokito这个mock框架,在生成测试用例的过程中会不断mock掉所有的外部依赖(这也是自动生成的),同时EvoSuite会自动生成测试脚本和测试数据(测试数据是按照先随机在深入搜索的方式进行的),它是以最大覆盖为目标的,因此使用EvoSuite生成的单元测试最后会有一个很完美的覆盖率,无论是行覆盖、条件覆盖、圈复杂的等。上述的全部事情也就导致了用EvoSuite生成的cases在执行对应的Cases的时候必须要有Evosuite框架的支持,也就是说Evosuite的配置必须一直在项目中。

    纵观全部生成的cases,我们会发现evosuite生产的cases会达到一个非常完美的代码覆盖度,但是却有可能没有一个正确业务逻辑的case。为了解决这个问题我们发现通过evosuite生成的cases和手动写的case可以同时运行,因此这里我们建议大家在项目中还是要手动添加正确业务逻辑的测试用例,这无疑也是对我们被测项目的质量有更加行之有效的保障作用。

    展开全文
  • X光 统计和分析Java EE 6软件,用于博客(经过压路机测试)和Web应用程序。 它是一个普通的Java EE 6(REST / JAX-RS,CDI,EJB,JPA)应用程序,在Glassfish v3.1上进行了...X-ray是该应用程序的示例应用程序。 书。
  • Kaffee是类似于Maven的软件项目管理工具,用Coffeescript编写。 Kaffee允许您编译,测试,最小化和许多其他任务,以使构建应用程序又简单又有趣。 警告:Kaffee当前缺少许多文档,并且仍处于开发阶段。 信息 有关更...
  • Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可...

    Maven 是什么?

    Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
    
    Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
    

    在 Mac OS X 上安装 Maven

    • 参考教程How to install Maven on Mac OSX

      因为 OS X 10.9 不再内置 Maven ,需要手动安装
      <pre><code>vim  ~/.bash_profile</code></pre>
      
      <pre><code>export M2_HOME=/Users/mkyong/apache-maven-3.1.1
      export PATH=$PATH:$M2_HOME/bin</code></pre>
    • 由于 JAVA_HOME 的路径没有指定,使用 mvn -version 命令时一直报错,经过 Google 后在 .bash_profile 中也指定了路径
      271645395834346.png

    • 再执行 mvn -version 命令,安装成功
      271646461302883.png

    • 使用 mvn archetype:generate 命令,maven 开始下载所需依赖,下载完成后在当前路径生成 package,但 [INFO] Generating project in Interactive mode 这一步卡了太久,经 Google 到 Stack Overflow上的答案 - Generating project in Interactive mode Taking lot of time后很快完成了。需要使用如下命令:
      mvn archetype:generate -DgroupId=com.helloworld.app -DartifactId=helloworld -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart
      271653431469316.png

    • package 建好之后,在工程路径下运行命令mvn compile
      271659003498208.png

    • 更改 /src/test/java/com/helloworld/app/AppTest.java 中的 testApp() 方法

    
    public void testApp()
    {
           App app = new com.helloworld.app.App();
           assertEquals("Hello World!", app.sayApp() );
    }
    
    • 更改 /src/main/java/com/helloworld/app/App.java
    
    public class App 
    {
        public String sayApp() {
        return "Hello World!";
    
    }
        
    public static void main( String[] args )
    {
         App app = new App();
         System.out.println( "Hello World!" );
    }
    
    • 运行命令 mvn compile 重新编译后再运行 mvn test,done~
      271713562557970.png

    转载于:https://www.cnblogs.com/triggerlin/p/4460607.html

    展开全文
  • Maven的简介

    2018-02-28 14:35:00
    1.1 Maven 简介Maven 是 Apache 软件基金会组织维护一款自动化构建工具,专注服务于 Java 平台项目构建和依赖管理。Maven 这个单词本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。 1.2 构建过程几个...

    1 What?

    1.1 Maven 简介Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。

    1.2 构建过程的几个主要环节

    ①清理:删除以前的编译结果,为重新编译做好准备。

    ②编译:将 Java 源程序编译为字节码文件。

    ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。

    ④报告:在每一次测试后以标准的格式记录和展示测试结果。

    ⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。

    ⑥安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。

    ⑦部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。

     

    1.3 Maven 核心概念Maven 能够实现自动化构建是和它的内部原理分不开的,

    ①POM②约定的目录结构③坐标④依赖管理⑤仓库管理⑥生命周期⑦插件和目标⑧继承⑨聚合

    2 how?

    Maven 的核心程序中仅仅定义了抽象的生命周期,而具体的操作则是由 Maven 的插件来完成的。可是Maven 的插件并不包含在 Maven 的核心程序中,在首次使用时需要联网下载。下载得到的插件会被保存到本地仓库中。本地仓库默认的位置是:~\.m2\repository。

     

    3 约定的目录结构

    约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须能找到 Java 源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:①通过配置的形式明确告诉它②基于第三方工具或框架的约定Maven 对工程目录结构的要求就属于后面的一种。

    JAVA工程

    web工程

    4 POM

    Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。Maven 工程的核心配置。

     

    5 坐标

    5.1 几何中的坐标[1]在一个平面中使用 x、y 两个向量可以唯一的确定平面中的一个点。[2]在空间中使用 x、y、z 三个向量可以唯一的确定空间中的一个点。

    6.2 Maven 的坐标使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。

    [1]groupid:公司或组织的域名倒序+当前项目名称

    [2]artifactId:当前项目的模块名称

    [3]version:当前模块的版本com.java.mavenHello0.0.1-SNAPSHOT

    6.3 如何通过坐标到仓库中查找 jar 包?

    [1]将 gav 三个向量连起来com.java.maven+Hello+0.0.1-SNAPSHOT

    [2]以连起来的字符串作为目录结构到仓库中查找com/java/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar

    ※注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:mvn install 

    展开全文
  • maven就是为了更好管理代码和软件开发 maven官网下载地址:http://maven.apache.org/download.cgi maven作用 1.可以管理jar文件 2.自动下载jar和他文档源代码 3.管理jar直接依赖 4.管理需要jar版本 5.帮你编译...
  • maven

    2017-06-22 11:41:18
    作为一名程序员,在开发过程中,经常需要面对不同运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同环境中,相关配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行...
  • maven使用junit3 在本系列中,我们已经学习了建立基本Spring MVC应用程序并学习了如何在... 我从来没有能够编写任何软件的地方,对于每段代码,我都先编写了一个测试,然后编写了代码。 如果您这样做了,并且被...
  • 1.1 Maven 简介Maven 是 Apache 软件基金会组织维护一款自动化构建工具,专注服务于 Java 平台项目构建和依赖管理。Maven 这个单词本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。 1.2 构建过程几个...
  • Insider专注于涵盖 ,对源代码进行分析以在源代码中找到漏洞,并专注于DevOps管道内的敏捷且易于实现的软件。 当前,我们支持以下技术:Java(Maven和Android),Kotlin(Android),Swift(iOS)、. NET完整框架...
  • 出品 | 51Testing软件测试网背景随着技术发展,Devops概念越来越深入人心,Devops使得构建、测试、发布软件能够更加地快捷、频繁和可靠。DevOps对应用程序发布有着重要影响,具备DevOps能力则发布软件产品时...
  • maven profile使用

    2017-05-25 18:25:28
    作为一名程序员,在开发过程中,经常需要面对不同运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同环境中,相关配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行...
  • Maven的安装与配置

    2018-11-13 21:30:28
    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目构建,报告和文档项目管理工具软件Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 缺省构建规则有较高可重用性,...
  • Maven理解

    2020-04-26 21:36:17
    Maven是Apache软件基金会组织维护一款自动化构建工具,专注服务于Java平台项目构建和依赖管理 网址:Maven依赖官网 流程 • 清理:删除以前编译结果,为重新编译做好准备。 • 编译:将Java源程序编译为字节码...
  • Spring框架是由于软件开发复杂性而创建。Spring使用是基本JavaBean来完成以前只可能由EJB完成事情。然而,Spring用途不仅仅限于服务器端开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java...
  • 作为一名程序员,在开发过程中,经常需要面对不同运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同环境中,相关配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行...
  • maven相信对于从事开发童鞋来说并不陌生,它是一款项目管理软件工具,能方便管理项目构建和发布。 maven项目生命周期: maven常用命令: mvn compile 编译源代码 mvn deploy 发布项目 mvn test-compile ...
  • Maven简介

    2020-08-24 22:48:35
    Maven 是 Apache 软件基金会组织维护一款自动化构建工具,专注服务于 Java 平台项目构建和 依赖管理。Maven 这个单词本意是:专家,内行。 何为构建(Build) 构建并不是创建,创建一个工程并不等于构建一个...
  • maven介绍

    2019-03-24 14:41:58
    1.1 Maven 简介Maven 是 Apache 软件基金会组织维护一款自动化构建工具,专注服务于 Java 平台项目构建和依赖管理。Maven 这个单词本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。 1.2 构建过程几个...
  • Maven入门笔记

    2020-09-30 18:33:11
    Maven:项目管理工具Maven简介Maven安装配置Maven入门程序 ...maven能干事 编译 测试(junit) 运行 打包 部署 主要应用于大型项目,可以提高开发效率 Maven安装配置 下载安装maven软件 Maven入门程序 ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

maven程序的软件测试