当前位置: 首页 > 知识库问答 >
问题:

在Maven Build Junit测试期间运行良好,但如果我手动运行Junit测试,为什么会失败?

凌通
2023-03-14

我的maven项目有一些问题。我在我的maven文件夹src/test/java中创建了一些JUnit测试。

如果我在命令行或Eclipse IDE中使用“mvn清理安装”创建了我的maven项目,并使用“清理”和“安装”等运行配置,所有测试都将正常运行,不会发生一些错误。

但是,如果我手动运行 JUnit 测试,其中一个 Junit 测试将失败。但是什么原因,为什么maven没有意识到这个事实呢?以下是我的maven pom.xml文件的代码片段:

    <plugins>       

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <optimize>true</optimize>
                <fork>true</fork>
                <source>${source.jdk}</source>
                <target>${target.jdk}</target>                  
            </configuration>
        </plugin>           

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <configuration>                
                <testFailureIgnore>false</testFailureIgnore>
            </configuration>
        </plugin>           

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>
                        jar-with-dependencies
                    </descriptorRef>
                </descriptorRefs>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifestEntries>
                        <Source-JDK>${source.jdk}</Source-JDK>
                        <Target-JDK>${target.jdk}</Target-JDK>                                      
                        <Project-Build-SourceEncoding>${project.build.sourceEncoding}</Project-Build-SourceEncoding>    
                        <Maven-Build-Timestamp>${maven.build.timestamp}</Maven-Build-Timestamp>
                    </manifestEntries>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>${project.groupId}.${project.artifactId}.MainClass</mainClass>
                    </manifest>
                </archive>
                <appendAssemblyId>false</appendAssemblyId>
                <classifier>jar-with-dependencies</classifier>
            </configuration>
            <executions>
                <execution>
                    <id>assembly-jar-Id</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

以下是失败的Junit代码:

 public void testProperties(){      

    String build_time = Parameters.BUILD_TIME.getParameter();

    Map<String, String> allProperties = MetaInformation.Properties();       
    for(Map.Entry<String, String> currentEntry : allProperties.entrySet()){

        if(currentEntry.getKey().equals(build_time)){               
            String project_build_value = currentEntry.getValue();               
            Assert.assertEquals(true, build_time_value != null && build_time_value.equals(""));             
        }           
    }

}

属性文件包含以下值:

buildTime=${timestamp}
encoding=${project.build.sourceEncoding}

Junit测试(读取“构建时”值)失败。“时间戳”是一个值,它基于我的maven项目的pom.xml。它给了我以下属性:

<properties>
    <timestamp>${maven.build.timestamp}</timestamp>
    <maven.build.timestamp.format>dd.MM.yyyy HH:mm</maven.build.timestamp.format>
</properties>   

${maven.build.timestamp}表示时间点,我的maven项目是使用命令mvn净安装构建的。读取此值的JUnit测试会带来一些麻烦,因为变量“project_build_value”在执行此JUnit测试期间为空。但是为什么以及如何解决这个问题呢?

共有1个答案

司徒嘉祥
2023-03-14

最有可能的是,您的测试取决于另一个测试的执行,该测试会生成一些文件,其他资源或将数据存储在某个地方(例如在数据库或其他内容中)。TDD(测试驱动程序开发)指出,您编写的任何测试都应该是它们自己的独立实体,这意味着:您编写的任何测试都应该是完全自给自足的,而不是依赖于之前执行的其他测试所产生的东西。

简而言之:确保您的测试在其< code>setUp()方法中生成了所有适当的资源/数据,或者在您的测试执行之前Maven复制了所需的测试资源。

调试依赖于由其他测试用例产生的资源/数据的测试用例从来都不是一个好主意,因为,在某些时候,你会忘记另一个测试正在干扰你的资源,并且会想为什么结果不是你所期望的。

 类似资料:
  • 从很久以前的某个版本开始(大约是1.b.35版),Nutz 就偷偷的加入了 maven 的 pom.xml 文件, 极好的解决了测试时需要依赖其他 jar 包的问题,接下来就让我们使用 Maven 来进行 JUnit 测试吧。 Nutz 在 Github 的 地址为 https://github.com/nutzam/nutz(Git@OSC镜像 https://git.oschina.net/n

  • 问题内容: 发生了最奇怪的事情,我的测试运行正常,但现在不再,我完全没有更改代码,这里是一个例外: 问题答案: 我看到您正在使用Eclipse,但您是否还在使用其他外部构建/测试工具,例如Ant或Maven?有时,在同时使用其他外部工具时,Eclipse可能会不同步。 如果使用外部工具,请执行清理生成的工件所需的所有操作(例如mvn clean)。然后刷新Eclipse项目并按照前面的建议进行干净

  • 我有一个测试类,有几个测试,都通过了。如果我将该类添加到测试套件中,则所有测试都会失败。 原因是无法解决对JavaFX类型的依赖关系。我使用了一个初始化JavaFX框架(例如应用程序线程等)的测试规则,这似乎可以正常工作,正如通过的测试所表明的那样。由于异常,测试失败: 为什么JUnit的行为会因我运行测试的方式而异?我怎样才能解决这个问题?请注意,这并不是针对so的GUI测试(我不想模拟用户操作

  • 在我的nodejs项目(用Typescript编写)中,我可以用以下命令运行我的测试: 他们成功了。我还在我的 package.json 文件中使用此命令,以便 以相同的方式运行它们,但在本例中,我得到: 这是我的包裹。json文件包含: 通过npm运行摩卡的正确变体是什么?

  • 我已经使用Appium和Java以及TestNG为Android应用程序编写了一些测试。我的测试在模拟器上本地运行良好,但当我将它们上传到设备场时,我的测试总是失败。我已经尽可能地简化了我的测试,但它仍然不起作用。目前,我尝试运行的测试会在打开应用程序时出现的提示中找到并单击“允许权限”按钮。代码: 观看Device Farm提供的视频,我可以看到它打开并立即关闭我的应用程序。它甚至没有像应该的那

  • 问题内容: 在运行JUnit测试时,我似乎总是会遇到此错误: 蚀outOfMemoryError:堆空间 我已经用JConsole监视了Eclipse,并且堆内存的峰值大约为150MB。我已将堆内存设置为1GB。 启动Eclipse时,我使用以下参数: 有谁知道是什么原因导致此问题?它仅在运行JUnit测试时发生。 问题答案: Junit测试在与Eclipse IDE不同的vm中运行。因此,内存不