Arquillian 不会执行超过 4 个测试

Arquillian Does Not Execute More Than 4 Tests

这个有点让人头疼:我有一个 Arquillian 测试 class 有 8 个测试。如果我一次执行其中的 4 个,它们都可以工作,但如果我再添加一个测试,最后一个就会失败。如果我执行全部 8 个,则最后 4 个失败。如果我更改顺序,最后 4 个仍然会失败。除此之外,没有押韵也没有理由执行哪些执行,哪些失败。

(如果我将一半的测试放在另一个 class 中也是如此。那么两个 classes 都可以自己执行,但是如果它们作为同一个 class 的一部分启动=68=]配置,第二个将无法通过所有测试。)

错误发生在@Before方法内部,所以这里是:

@PersistenceContext
private EntityManager em;
@Inject
private UserTransaction transaction;

@Before
public void setUp() throws Exception {
  Assert.assertNotNull("EntityManager cannot be null!", this.em);

  this.transaction.begin();
  this.em.createNativeQuery(MY_SCRIPT_1).executeUpdate();
  this.em.createNativeQuery(MY_SCRIPT_2).executeUpdate();
  this.transaction.commit();
}

其中 MY_SCRIPT_X 是一堆代码,但相关部分可能是:

-- MY_SCRIPT_1

DROP SCHEMA IF EXISTS scheme1 CASCADE;
DROP SCHEMA IF EXISTS scheme2 CASCADE;
DROP SCHEMA IF EXISTS public CASCADE;
CREATE SCHEMA public;

-- MY_SCRIPT_2

CREATE TABLE scheme1.dbconfig (
  propkey character varying NOT NULL, 
  propvalue character varying NOT NULL, 
  CONSTRAINT dbconfig_pkey PRIMARY KEY (propkey)
);
COMMENT ON TABLE scheme1.dbconfig IS 'global database configuration properties';

INSERT INTO scheme1.dbconfig VALUES
  ('initialized', true),
  ('version', 2);

如果我只使用一个大脚本 [em.createNativeQuery(MY_SCRIPT_1 + MY_SCRIPT_2)],则不会发生错误,即使 table scheme1.dbconfig 仅在其中一个文件中被引用。

我得到的错误消息是:

09:20:18,243 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-24) ERROR: relation "scheme1.dbconfig" does not exist Position: 169

我不知道169的位置在哪里(忽略所有评论,第169个位置应该在propkey的R和O之间,这看起来很奇怪)。但是我在执行了整个class之后查了下数据库,出现了上面的错误,tablescheme1.dbconfig确实存在

我知道,这是一个奇怪的特定问题,但有人知道问题可能是什么(甚至如何进一步调试)吗?


更多信息:

我重现错误所需要做的就是(beans.xml 是一个默认的空文件,persistence.xml只有jta-data-source):

@RunWith(Arquillian.class)
public class BugTest {

private static final String CLEANUP_SCRIPT = "DROP SCHEMA IF EXISTS scheme1 CASCADE; "
        + "DROP SCHEMA IF EXISTS public CASCADE; " 
        + "CREATE SCHEMA public AUTHORIZATION testdba;";
private static final String CREATE_SCRIPT = "CREATE SCHEMA scheme1; "
        + "CREATE TABLE scheme1.dbconfig ( propkey character varying NOT NULL, propvalue character varying NOT NULL, CONSTRAINT dbconfig_pkey PRIMARY KEY (propkey) ); "
        + "INSERT INTO scheme1.dbconfig VALUES ('initialized', true), ('version', 2);";

@Deployment
public static Archive<?> createDeployment() {
    return ShrinkWrap.create(JavaArchive.class).addAsManifestResource("META-INF/beans.xml", "beans.xml")
            .addAsManifestResource("META-INF/persistence.xml", "persistence.xml");
}

@PersistenceContext
private EntityManager em;
@Inject
private UserTransaction transaction;

@Before
public void setUp() throws Exception {
    this.transaction.begin();
    this.em.createNativeQuery(CLEANUP_SCRIPT).executeUpdate();
    this.em.createNativeQuery(CREATE_SCRIPT).executeUpdate();
    this.transaction.commit();
}

// since an exception gets thrown in the setUp() method, these are not called
// they are only needed because the exception gets thrown for more than
// four tests methods
@Test public void test1() { }
@Test public void test2() { }
@Test public void test3() { }
@Test public void test4() { }
@Test public void test5() { }
@Test public void test6() { }
@Test public void test7() { }
@Test public void test8() { }
}

不,Arquillian 将 运行 在单个文件中进行尽可能多的测试,或者至少直到 JUnit(或 TestNG)停止 运行ning。以下是来自 Apache DeltaSpike 的一些示例,其中包含四个以上的测试 运行ning:

https://github.com/apache/deltaspike/blob/master/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/CallingHandlersTest.java

https://github.com/apache/deltaspike/blob/master/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java

https://github.com/apache/deltaspike/blob/master/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java

您的设置中一定有什么东西导致了问题。

我运行在过去的两年里一次又一次地解决这个问题。唯一可靠的作品如下:

  • 使用一个脚本而不是两个;在这种情况下,我将在执行之前连接这两个文件
  • 不是每次都初始化;我将测试是否存在其中一个模式,并希望并祈祷之前的测试使数据库处于可用状态(祝您调试顺利)