Maven/junit 项目组织
Maven/junit project organization
我有三个包裹:
- Foo 提供了一定的 API
- FooMySQL(取决于 Foo)使用 MySQL
实现 Foo API
- FooPostgreSQL(依赖于 Foo)使用 PostgreSQL
实现 Foo API
我有一堆 junit 测试,应该 运行 两次:一次是 FooMySQL,一次是 FooPostgreSQL。它们是相同的测试,因为 API 对两种实现的行为应该相同,只有设置和拆卸略有不同。
问题:我应该在哪里定义那些测试?最合乎逻辑的地方似乎是在 Foo 中。但是,在 Foo 中,它们不可执行,因为 Foo 不知道任何实现。我可以将它们放入 FooMySQL,但看来我必须在 FooPostgreSQL 上拥有完整副本,因为无法通过 Foo[= 的 Maven 依赖机制引用 Foo 中定义的任何 "test" 代码28=] 等等(这是正确的,还是我漏掉了一个技巧?)
或者,我可以创建一个单独的 FooTests 项目,FooMySQL 和 FooPostgreSQL 测试可能依赖于该项目。但这在某种程度上听起来也是错误的。有更好的办法吗?
您应该知道的第一件事是您应该 unit-test 是您的实现。总是。我认为你倾向于那个,但我不确定,因为你提到了测试 Foo
,我只是想确保它已经建立。
因此,让我们直接这样做,而无需对所有测试进行两次。
public abstract class FooTestBase {
protected abstract Foo getFoo();
@Test public void testBarMethod() {
// Do some tests calling getFoo().
}
}
public class FooMysqlTest extends FooTestBase {
@Before public void setUp() {
// Do stuff
}
@After public void tearDown() {
// Do stuff
}
@Override protected Foo getFoo() {
return new FooMysql();
}
}
public class FooPostgresqlTest extends FooTestBase {
@Before public void setUp() {
// Do stuff
}
@After public void tearDown() {
// Do stuff
}
@Override protected Foo getFoo() {
return new FooPostgresql();
}
}
由于您使用 Maven,默认情况下 FooTestBase
不会被视为测试 class 因为它不以 Test
开头或以 Test
结尾或TestCase
。因此,您的测试将集中在 FooTestBase
中,并且它们将在每个 child class.
中执行
您的测试将只编写一次,并且您的 setup/teardown 将特定于每个实现。
刚刚发现这个:https://maven.apache.org/guides/mini/guide-attached-tests.html
<dependencies>
<dependency>
...
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
这样可以更优雅地解决我的问题;正在调查。
更新:它应该有效!
我有三个包裹:
- Foo 提供了一定的 API
- FooMySQL(取决于 Foo)使用 MySQL 实现 Foo API
- FooPostgreSQL(依赖于 Foo)使用 PostgreSQL 实现 Foo API
我有一堆 junit 测试,应该 运行 两次:一次是 FooMySQL,一次是 FooPostgreSQL。它们是相同的测试,因为 API 对两种实现的行为应该相同,只有设置和拆卸略有不同。
问题:我应该在哪里定义那些测试?最合乎逻辑的地方似乎是在 Foo 中。但是,在 Foo 中,它们不可执行,因为 Foo 不知道任何实现。我可以将它们放入 FooMySQL,但看来我必须在 FooPostgreSQL 上拥有完整副本,因为无法通过 Foo[= 的 Maven 依赖机制引用 Foo 中定义的任何 "test" 代码28=] 等等(这是正确的,还是我漏掉了一个技巧?)
或者,我可以创建一个单独的 FooTests 项目,FooMySQL 和 FooPostgreSQL 测试可能依赖于该项目。但这在某种程度上听起来也是错误的。有更好的办法吗?
您应该知道的第一件事是您应该 unit-test 是您的实现。总是。我认为你倾向于那个,但我不确定,因为你提到了测试 Foo
,我只是想确保它已经建立。
因此,让我们直接这样做,而无需对所有测试进行两次。
public abstract class FooTestBase {
protected abstract Foo getFoo();
@Test public void testBarMethod() {
// Do some tests calling getFoo().
}
}
public class FooMysqlTest extends FooTestBase {
@Before public void setUp() {
// Do stuff
}
@After public void tearDown() {
// Do stuff
}
@Override protected Foo getFoo() {
return new FooMysql();
}
}
public class FooPostgresqlTest extends FooTestBase {
@Before public void setUp() {
// Do stuff
}
@After public void tearDown() {
// Do stuff
}
@Override protected Foo getFoo() {
return new FooPostgresql();
}
}
由于您使用 Maven,默认情况下 FooTestBase
不会被视为测试 class 因为它不以 Test
开头或以 Test
结尾或TestCase
。因此,您的测试将集中在 FooTestBase
中,并且它们将在每个 child class.
您的测试将只编写一次,并且您的 setup/teardown 将特定于每个实现。
刚刚发现这个:https://maven.apache.org/guides/mini/guide-attached-tests.html
<dependencies>
<dependency>
...
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
这样可以更优雅地解决我的问题;正在调查。
更新:它应该有效!