Grails 2.0 集成测试污染?

Posted

技术标签:

【中文标题】Grails 2.0 集成测试污染?【英文标题】:Grails 2.0 integration test pollution? 【发布时间】:2012-02-17 14:24:43 【问题描述】:

所以我有一个小型集成测试,总共包含 5 个测试。仅运行该测试会导致所有测试都通过。但是,运行我的整个测试套件会导致 5 次测试中的 4 次失败。

我最近刚刚从 1.3.7 升级到 grails-2.0,并从 hsqldb 切换到 h2。

有没有人指出我应该朝哪个方向寻找以解决这个(测试污染)问题?

领域模型

集成测试:

class SeriesIntegrationTests extends GrailsUnitTestCase 
    Series series
    Episode episode

    protected void setUp() 
        super.setUp()
        series = new Series(ttdbId: 2348);
        episode = new Episode(ttdbId: 2983, season: 0, episodeNumber: 0, series: series);
    

    protected void tearDown() 
        super.tearDown()
    

    void testCreateSeries() 
        series.save()
        assertFalse("should not have validation errors : $series.errors", series.hasErrors())
        assertEquals("should be one series stored in db", 1, Series.count())
    

    void testCreateEpisode() 
        series.save()
        episode.save()
        assertFalse("should not have validation errors : $episode.errors", episode.hasErrors())
        assertEquals("should be one episode stored in db", 1, Episode.count())
    

    void testCreateSeriesAndAddEpisode() 
        series.addToEpisodes(episode)
        series.save(flush: true)
        series.refresh()
        assertEquals("series should contain one episode", 1, series.episodes.size())
    

    void testDeleteSeriesAndCascadeToEpisode() 
        series.addToEpisodes(episode)
        series.save(flush: true)
        series.delete(flush: true)
        assertEquals(0, Episode.count())
        assertEquals(0, Series.count())

    

    void testDeleteSeriesAndCascadeToBackdropImage() 
        series.backdrop = new Image();
        series.backdrop.binaryData = new byte[0]
        series.save(flush: true)

        assertFalse(series.hasErrors())
        assertEquals(1, Image.count())

        series.delete(flush: true)
        assertEquals(0, Image.count())
    

【问题讨论】:

如果您显示相关代码,您更有可能获得帮助 SeriesIntegrationTests是在/test/unit目录下还是/test/integration目录下? 【参考方案1】:

从 1.3.7 迁移到 2.0 时,我遇到了类似的问题。启动时集成测试正常

grails test-app --integration

但使用

启动时失败
grails test-app

我通过将单元测试转换为 grails 2.0 测试(使用注释)来修复所有问题。

【讨论】:

两个命令的失败测试数量仍然相同。但是,在我的开发人员机器上,一切都很好。从来没有失败过的测试。但在 CI 服务器上,这些测试失败了。 每次测试执行时您是否都在 CI 上重新创建数据库?如果不是,那可能会导致错误,因为您假设数据库中没有任何以前的对象。此外,这些测试看起来不会提供很多价值,因为它们基本上是在测试 Grails 的行为,而不是您编写的任何代码。.. "create-drop" 在配置中指定。所以每次运行都应该删除数据库。【参考方案2】:

我的解决方案是将所有单元测试升级到 grails 2.0 进行测试的方法。完成后,所有测试都通过了。因此,单元测试似乎以某种方式污染了集成测试。但仅限于某些硬件配置。

【讨论】:

以上是关于Grails 2.0 集成测试污染?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 grails 3 中运行单个集成测试?

Grails 2.3 迁移脚本不会在集成测试期间运行

如何使用 @Build 为 grails 集成测试创建多种类型的测试数据

Grails里的集成测试代码试例

具有 to_date 的查询的 Grails 集成测试?

Grails Connections 在集成测试中的行为非常不同