【问题标题】:JUnit: Looking for communication path between @before method and individual test methodJUnit:寻找@before方法和单个测试方法之间的通信路径
【发布时间】:2014-01-26 05:22:35
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我不明白你的情况。您希望您的测试独立且并行地运行。 @Before 中的代码在每次测试之前运行。因此,只有您可以在 @before 方法中创建的所有测试都通用的测试数据。为什么您不能在测试方法本身中创建非常特定于单个测试的所有其他测试数据?
  • 因为即使 common 数据不是特定测试的对象,也可能会受到测试方法的影响。考虑用户帐户和两个测试:1)一个测试(作为副作用)导致用户帐户被停用,以及 2)一个创建订单的测试。如果两个测试都依赖于同一个用户对象,那么这些测试就不会是独立的,尽管用户对象不是这些测试的主题。因此,我希望有不同的用户帐户对象,但不想在每个测试中重复创建(即使不是通过辅助方法)。这就是我想使用@before 方法的原因

标签: java integration-testing test-data


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    我在春天使用

    @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")
    

    【讨论】:

    • 也想过这个。但它真的适用于我的集成测试场景吗?请注意,我有两个事务:一个是测试方法,另一个是在已部署的 Web 应用程序中运行测试:只要未提交测试事务,应用程序就不会看到测试数据,对吧?
    • 是的,它看不见!但是,您可以将隔离级别(仅用于测试)设置为 Read uncommitted 以允许 DIRTY READ。
    • 好的,但是我最终又陷入了肮脏的测试依赖关系;-)
    • mhhhh,是的!我认为您正在使用单元测试进行不正确(但通常完成)正确的集成测试。你可以试试 Arquillian
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2020-07-08
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多