1

是否有支持以下场景的 Java 测试库?

假设,您必须为基于数据库的 Web 应用程序(例如使用 Selenium)编写 Web 浏览器测试。典型的测试将具有以下工作流程:

  • 将测试数据插入数据库
  • 运行测试逻辑(打开 Web 浏览器,浏览某处,操作某事,验证是否显示正确的内容,验证数据库状态是否正确更改)
  • 清除数据库

特别是在这种集成测试的情况下,您通常需要一组复杂的不同对象来运行 Web 应用程序(例如,您需要一个用户帐户、与业务相关的东西,如产品、订单等)。为了保持测试相互独立并能够并行运行测试,您希望为每个测试创建此对象网络,可能具有伪随机对象属性,例如user.name="user_123".

现在,在我看来,为每个测试重复做一些事情的好地方是@Before-annotated 方法。但是,如果该@Before方法插入了一个 DB 状态,则测试方法将不知道如何访问该状态,例如如何找到该@Before方法创建的用户对象。最好有一种测试方法上下文,它由@Before方法设置并且可以被测试方法使用。

我考虑过自己实现类似的东西,也许是一个简单的静态哈希图,以测试方法名称为键,但可能已经有一个提供此功能的库并且您知道它;-)。

4

2 回答 2

1

你几乎在那里。事实上,我们在产品 (HP ALM) 中使用完全相同的技术进行集成测试。

在您的测试类中,将 @Before 方法生成的任何标记存储在成员中并在测试中使用它们。

为了不对每个集成测试类重复此操作,我们定义了一个包含所有上下文和初始化逻辑的基类,并且我们只需使用测试代码进行扩展。

这个基类实际上可以扩展您可能正在使用的任何其他测试基础设施(例如 AbstractJUnit4SpringContextTests)。

于 2014-01-08T10:10:23.863 回答
0

Rainer198,而不是“清除数据库”,您可以回滚 tx。我使用这种方式来解决问题,它更干净,但显然,它取决于您的行为。

在春天我使用

@Transactional //This annotation tells the Spring test runner to always roll back each transaction it creates.
@TransactionConfiguration(defaultRollback = true)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/spring/common-main-test.xml")
于 2014-01-08T08:22:34.813 回答