当我将插件添加到 Redmine 安装时,大量测试失败

an incredible number of tests fail when I add plugins to a Redmine installation

我安装了 Redmine 版本 3.4.2.stable 到 Ruby 2.3.3,然后点击 rake test

只有 3 个测试失败,这对于新安装的数千个测试批次中的第一个 运行 非常好。

然后我添加了一堆插件。假设它们是:

google_analytics_plugin        1.0.0
progressive_projects_list      1.0.0
redmine_agile                  1.4.5
redmine_agreement              0.1.1
redmine_base_deface            0.0.1
redmine_cms                    1.0.1
redmine_contacts               4.1.1

现在更多的测试失败了。确切地说,4225 个测试用例中有 215 次失败和 1530 次错误。我假设 rake test 调用 rake redmine:plugins:test,但这仍然是一个令人难以置信的失败次数。

例如,错误之一是:

MemberTest#test_validate_member_role:
ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '\xD0\xAD\xD1\x82\xD0\xB8...' for column 'title' at row 1: INSERT INTO `wiki_pages` (`created_on`, `title`, `id`, `wiki_id`, `protected`, `parent_id`) VALUES ('2007-03-07 15:18:07', 'Этика_менеджмента', 10, 1, 0, NULL)

似乎有人将语言切换为俄语,但没有切换回来。

现在我的实际问题是:Redmine-land 中的每个人都接受这种级别的测试脆弱性吗?我当然不能期望修复每个测试,向他们的维护者提交补丁,然后升级我的客户端以使用这些插件的最新版本。

我应该如何使用 Redmine 进行 TDD?

Redmine 项目本身维护其核心测试,该测试假设其功能完整性到位,即不存在可更改功能的插件。因此,一个没有任何插件的普通 Redmine 有望通过所有核心测试。

但是,一旦引入插件,情况就会发生变化。由于许多插件挂钩或更改许多内部 Redmine 功能(通常通过猴子补丁)以提供它们的功能,安装它们会导致对核心 Redmine 的各种测试中断,因为它们的假设不再成立。由于 Remdine 只有很少的内部 API 供插件挂接,monkey-patches 通常是插件挂接核心的唯一途径。

不幸的是,很难(如果不是不可能的话)对核心测试以及插件的功能进行猴子修补以使它们适应 new/changed 行为。

这导致了目前几乎所有 Redmine 插件都几乎没有(如果有的话)测试的不幸情况。有时,您会对插件的功能进行单元测试,但功能齐全的集成测试非常 很少见。因此,在使用插件时,您通常不能依赖工作测试,而必须恢复到代码审查和手动点击测试。

我发现在审查插件时,效果最好的插件只有很少的猴子补丁,尽量将自己限制在稳定的接口或尽可能提供钩子,并避免覆盖 Redmine 的核心功能。