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

maven测试阶段用于测试目的的初始化数据库

宗政财
2023-03-14

我正在尝试执行以下操作:

>

  • 在mvn测试阶段将一些数据库脚本执行到hsqldb中

    将该数据库用于测试目的

    我能够配置maven,以便每次调用测试阶段时,所有脚本都成功执行,但是(当然有但是),我所有的测试都失败了。

    我的配置:

    pom.xml

    <build>
        <plugins>
            <!-- Plugin maven for sql -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sql-maven-plugin</artifactId>
    
                <dependencies>
                    <!-- Dependency to jdbc driver -->
                    <dependency>
                        <groupId>org.hsqldb</groupId>
                        <artifactId>hsqldb</artifactId>
                        <version>${hsql-version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                    <encoding>UTF-8</encoding>
                    <driver>org.hsqldb.jdbcDriver</driver>
                    <url>jdbc:hsqldb:mem:sweetdev_skill_db;shutdown=false</url>
                    <settingsKey>hsql-db-test</settingsKey>
                    <!--all executions are ignored if -Dmaven.test.skip=true-->
                    <skip>${maven.test.skip}</skip>
                </configuration>
                <executions>
                    <!--  Create integration test data before running the tests -->
                    <execution>
                        <id>create-integration-test-data</id>
                        <phase>process-test-resources</phase>
                        <inherited>true</inherited>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <url>jdbc:hsqldb:mem:db;shutdown=false</url>
                            <autocommit>true</autocommit>
                            <orderFile>ascending</orderFile>
                            <fileset>
                                <basedir>${basedir}/src/test/resources/sql</basedir>
                                <includes>
                                    <include>create.sql</include>
                                    <include>insert.sql</include>
                                </includes>
                            </fileset>
                        </configuration>
                    </execution>
    
                    <!--  Drop data after executing tests -->
                    <execution>
                        <id>drop-db-after-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <orderFile>ascending</orderFile>
                            <fileset>
                                <basedir>${basedir}/src/test/resources/sql</basedir>
                                <includes>
                                    <include>drop.sql</include>
                                </includes>
                            </fileset>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    测试Spring配置:

    <bean id="datasource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver">
        </property>
        <property name="url" value="jdbc:hsqldb:mem:db"></property>
        <property name="username" value="sa">
        </property>
        <property name="password" value="">
        </property>
    </bean>
    
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="datasource" />
        <!-- use testingSetup pu -->
        <property name="persistenceUnitName" value="testingSetup" />
        <property name="persistenceXmlLocation" value="persistence.xml" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" />
                <property name="generateDdl" value="true" />
            </bean>
        </property>
    </bean>
    
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    

    输出:

        [INFO] ------------------------------------------------------------------------
        [INFO] [clean:clean]
        [INFO] Deleting directory D:\dev\projects\project-data\target
        [INFO] [resources:resources]
        [INFO] Using default encoding to copy filtered resources.
        [INFO] [compiler:compile]
        [INFO] Compiling 62 source files to D:\dev\projects\project-data\target\classes
        [INFO] [resources:testResources]
        [INFO] Using default encoding to copy filtered resources.
        [INFO] [sql:execute {execution: create-integration-test-data}]
        [INFO] Executing file: D:\dev\projects\project-data\src\test\resources\sql\create.sql
        [INFO] Executing file: D:\dev\projects\project-data\src\test\resources\sql\insert.sql
        [INFO] 230 of 230 SQL statements executed successfully
        [INFO] [compiler:testCompile]
        [INFO] Compiling 12 source files to D:\dev\projects\project-data\target\test-classes
        [INFO] [surefire:test]
        [INFO] Surefire report directory: D:\dev\projects\project-data\target\surefire-reports
    

    但后来我所有的测试都失败了。我需要你的帮助,找出为什么它不起作用,并帮助我找到解决方案。非常感谢。

    @安德鲁洛维诺夫

    这是测试输出之一:

        -------------------------------------------------------------------------------
        Test set: com.ideo.sweetdevskill.data.impl.TestAcquisitionDAOImpl
        -------------------------------------------------------------------------------
        Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.17 sec <<< FAILURE!
        testGetListAcquisitionByUser(com.ideo.sweetdevskill.data.impl.TestAcquisitionDAOImpl)  Time elapsed: 0.148 sec  <<< ERROR!
        java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
            at java.util.ArrayList.RangeCheck(ArrayList.java:547)
            at java.util.ArrayList.get(ArrayList.java:322)
            at com.ideo.sweetdevskill.data.impl.TestAcquisitionDAOImpl.testGetListAcquisitionByUser(TestAcquisitionDAOImpl.java:100)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
            at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
            at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
            at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
            at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
            at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
            at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
            at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
            at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
            at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
            at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
            at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
            at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
            at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
            at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
            at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
            at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
            at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
            at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
            at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
            at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
            at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
            at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
            at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
            at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
    

    谢谢

  • 共有2个答案

    微生信鸿
    2023-03-14

    我已经答应发布解决方案,所以我在这里。

    让我们从spring配置开始

        <?xml version="1.0" encoding="UTF-8"?>
    <!--beans followed by all xml schemas here -->
        <!-- HSQL datasource for test purpose-->
        <bean id="datasource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
            <property name="url" value="jdbc:hsqldb:file:db" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>
    
        <!-- ============================ ENTITY MANAGER    ================================= -->
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="datasource" />
            <!-- use testingSetup pu -->
            <property name="persistenceUnitName" value="testingSetup" />
            <property name="persistenceXmlLocation" value="persistence.xml" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="showSql" value="false" />
                    <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" />
                    <property name="generateDdl" value="false" />
                </bean>
            </property>
        </bean>
    <!-- all other things you may need-->
    </beans>
    

    坚持不懈xml的结构与pom中的应用程序相同。项目的xml:(我这里只包括相关部分:

        <!-- Plugin maven for sql -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sql-maven-plugin</artifactId>
                <dependencies>
                    <!-- Dependency to jdbc driver -->
                    <dependency>
                        <groupId>org.hsqldb</groupId>
                        <artifactId>hsqldb</artifactId>
                        <version>${hsql-version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                    <encoding>UTF-8</encoding>
                    <driver>org.hsqldb.jdbcDriver</driver>
                    <url>jdbc:hsqldb:file:${basedir}/db;shutdown=true</url>
                    <autocommit>true</autocommit>
                    <settingsKey>hsql-db-test</settingsKey>
                    <!--all executions are ignored if -DskipTests=true-->
                    <skip>${skipTests}</skip>
                </configuration>
                <executions>
                    <!--  Create test data before running the tests -->
                    <execution>
                        <id>create-test-compile-data</id>
                        <phase>process-test-sources</phase>
                        <inherited>true</inherited>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <url>jdbc:hsqldb:file:${basedir}/db;shutdown=true</url>
                            <driver>org.hsqldb.jdbcDriver</driver>
    
                            <orderFile>ascending</orderFile>
                            <detail>true</detail>
                            <fileset>
                                <basedir>${basedir}/src/test/resources/sql</basedir>
                                <includes>
                                    <include>script-create.sql</include>
                                    <include>script-insert.sql</include>
                                </includes>
                            </fileset>
                            <autocommit>true</autocommit>
                        </configuration>
                    </execution>
                    <!--  Drop test data after running the tests include hereafter -->
    
            </plugin>
    

    谢谢你的帮助。

    仲孙兴平
    2023-03-14

    比较配置中的这些行。数据库名称不同,因此使用了两个不同的数据库。

    <url>jdbc:hsqldb:mem:sweetdev_skill_db;shutdown=false</url>
    
    <property name="url" value="jdbc:hsqldb:mem:db"></property>
    
     类似资料:
    • 在将一些测试从JUnit迁移到TestNG时,我遇到了一个问题,因为这些测试框架处理它们的测试类实例的方式不同。 JUnit为每个测试方法创建一个新的测试类实例。所以我看到的一个常见模式是: 相比之下,TestNG对所有测试方法使用测试类的单个实例。所以上面的模式行不通!因为数据存储在实例字段中,所以值不再是孤立的。如果启用了并行执行,这可能会导致在测试中覆盖数据。 那么我该如何使用TestNG呢

    • 我可以使用Spring以编程方式创建和初始化嵌入式数据库: 或通过Spring配置: 这里,我的脚本和存储在目录中。因此,如果使用嵌入式数据库运行测试时: 然后,中的文件就可用了,一切都很好。 由:java.io.FileNotFoundException引起:无法打开类路径资源[schema.sql],因为它不存在 现在,如果我将脚本放入中,一切都可以工作了,但是这些脚本只是用来填充嵌入式数据库

    • 问题内容: 我试图简单地测试JLS保证的最终字段的初始化安全性。这是我写的论文。但是,根据我当前的代码,我无法使其失败。有人可以告诉我我做错了什么吗,或者这只是我必须一遍又一遍然后看到失败的时机而已? 这是我的代码: 我的线程正在这样调用它: 我已经多次运行过这种情况。我当前的循环产生了10,000个线程,但是我已经完成了1000、100000,甚至一百万个线程。仍然没有失败。我总是看到3和4这两

    • 运行似乎surefire没有执行其测试目标(或者至少没有选择我在配置中包含的测试)。 这是一个多模块maven项目,目前全部在groovy中,其结构类似于以下内容: 我在pom中有以下surefire配置。xml: 但是,当我针对这个pom执行

    • 我有一个多模块的maven项目 我有maven surefire插件设置,用于执行单元测试“*测试。“核心api”模块中包含java。 我们在一个单独的“集成测试”模块中进行了缓慢的长时间运行的集成测试。我们使用“*测试。java也用于我们的integ测试。 我们需要能够编译所有源代码,但希望排除“intg-test”作为默认maven“test”阶段的一部分运行。我们计划使用配置文件来启用“in

    • 问题内容: 在IDE中进行开发时,跟踪和调试日志可能会有所帮助,但是在构建期间,我发现这些行非常令人不安,并且混淆了maven或其他构建工具打印的报告。 让log4j尊重系统属性(如1)以与maven一起使用或不需要对项目文件进行更改的东西会很好。我知道我可以指定 2,但我想在这里询问是否有人在构建过程中找到了一种更智能的方法来禁用日志记录,而手动干预最少。即,一些将maven检测为调用方的jav