【问题标题】:Arquillian Does Not Execute More Than 4 TestsArquillian 执行的测试不超过 4 次
【发布时间】:2015-12-28 08:38:18
【问题描述】:

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

(如果我将一半的测试放在另一个类中,情况也是如此。然后两个类都可以自行执行,但如果它们作为相同运行配置的一部分启动,第二个类的所有测试都将失败。 )

错误发生在@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)],则不会发生此错误,即使表 scheme1.dbconfig 仅在其中一个文件中引用。

我得到的错误信息是:

09:20:18,243 错误 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 24)错误:关系“scheme1.dbconfig”不存在 位置:169

我不知道位置 169 在哪里(忽略所有 cmets,第 169 个位置应该在 propkey 的 R 和 O 之间,这看起来很奇怪)。但是我在执行完整个类后检查了数据库,得到了上面的错误,表scheme1.dbconfig确实存在。

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


更多信息:

  • 数据库:PostgreSQL
  • 休眠:4.3.5
  • 容器:Wildfly 8.1.0.Final

我重现错误所需的只是(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() { }
}

【问题讨论】:

  • 只是吐口水,但我猜这与测试运行者将测试拆分为并行作业有关,如果它们的数量超过阈值。
  • @Sneftel 我在 Maven 中禁用了并行测试,AFAIK Eclipse 根本不进行并行测试,所以不可能这样。
  • 这太抽象了。您可以提供的信息越多越好。什么数据库提供商?什么版本的休眠?你在运行什么容器?f 你能提供完整的测试吗?完整的错误(你只包括 1 行)?
  • @JohnAment 我将信息添加到问题中。可悲的是,没有堆栈跟踪或任何东西,只有一行(JUnit / Client 端只将该行包装成ArquillianProxyException)。

标签: jboss-arquillian


【解决方案1】:

在过去的两年里,我一次又一次地遇到这个问题。唯一可靠的工作如下:

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 甚至没有一个测试类具有设置数据库的@Before 方法...
    • 你的问题没有问这个问题,它问的是是否可以运行四个以上的测试。尝试查看 Arquillian Persistence Extension,因为它会为您处理大量此类基础架构代码。
    • 也许你应该再读一遍这个问题(提示:它是以问号结尾的句子)。
    • 似乎你遇到了一个竞争条件,在另一个测试放弃该方案后发生插入。 Arquillian Persistence 在这里应该有所帮助。
    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2020-06-07
    • 2011-11-12
    • 2022-01-02
    相关资源
    最近更新 更多