【问题标题】:Should one include tests in a packaged gem?是否应该在打包的 gem 中包含测试?
【发布时间】:2016-06-14 17:35:14
【问题描述】:

我一直在寻找文档和著名 gem 示例来回答一个简单的问题:

是否应该在自己的 PACKAGED gem 中包含测试,如果是,为什么?

换一种方式,您是否将测试文件添加到files gemspec 属性中,您是否通过add_development_dependencies 包含测试依赖项?如果是这样,为什么

测试 gem 并将测试包含在 gem 的源存储库中对我来说非常有意义。将测试与打包在 gem 中的已部署源代码一起包括在内对我来说意义不大。人们是否有一种标准方法可以使用 ruby​​gems 中的宝石测试?

也就是说,似乎很多大型项目都包含测试,所以我必须遗漏一些东西,对吧?

【问题讨论】:

  • 如果您有大量的测试文件,也许没有,请保持 .gem 占用空间精简。如果它们很小,为什么不呢?
  • 为什么是?如果用户没有简单的方法来运行保证有效的 gem 测试(即 ruby​​gems 不包含调用 gem 测试的已知钩子),那么它们有什么用处?
  • 如果它们的大小很小,请不要担心,另外 6KB 的代码不会杀死任何人。如果它们很大,请不要打扰包括它们。宝石中有大量垃圾,测试通常是最后的。

标签: ruby rubygems


【解决方案1】:

无需在您的 gem 文件中包含测试。但是,如果测试文件很小(它们可能是),那也没什么大不了的。

长期以来,在使用命令bundle gem mygemname创建新gem时,生成的gemspec中包含以下几行:

Gem::Specification.new do |s|
  # ...
  s.files = `git ls-files -z`.split("\x0")
  s.test_files = s.files.grep(/^(test|spec|features)\//)
  # ...
end

由于您的测试已经包含在 test_files 中,因此它们也包含在 files 中实际上并不重要。

但是,如果您今天运行相同的命令 bundle gem mygemname,那么您将在生成的 gemspec 文件中看到这一行:

Gem::Specification.new do |s|
  # ...
  s.files  = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  # No mention of s.test_files !
  # ...
end

发生了什么变化?

好吧,s.test_files 现在几乎被弃用了。 RubyGems 中有一个 open issue 不安装 test_files,由于“向后兼容性”,它已被推迟到 2.x 后的 RubyGems 版本。以前也可以在安装 Gem 的同时对其进行测试,gem install -t gemname;这个功能现在是removed(参见错误#25707)。

我相信,这就是为什么您仍然会在源代码中看到大量带有测试文件的 gem。但是,包括它们已经没有任何意义了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多