JUnit:寻找@before方法和单个测试方法之间的通信路径

时间:2014-01-08 08:06:51

标签: java integration-testing test-data

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

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

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

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

现在,在我看来,每个测试必须重复的事情的好地方是@Before - 注释方法。但是,如果@Before方法插入数据库状态,则测试方法将不知道如何访问此状态,例如如何找到@Before方法创建的用户对象。有一种测试方法上下文会很好,它由@Before方法设置,可以被测试方法使用。

我想过在我自己实现这样的东西,也许是一个简单的静态hashmap,测试方法名称是关键,但可能已经有一个提供此功能的库,你知道它;-)。

2 个答案:

答案 0 :(得分:1)

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

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

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

此基类可以扩展您可能正在使用的任何其他测试基础(例如AbstractJUnit4SpringContextTests)。

答案 1 :(得分: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")