当我将插件添加到 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 的核心功能。
我安装了 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 的核心功能。