测试不会自动运行

 博菡 发布于 2022-12-07 15:31

我正在尝试在我的Exercism文件夹中设置Guard,以便所有测试都自动运行(使用guard-minitest).

文件夹结构如下所示:

.
??? exercism
??? ruby
    ??? bob
    ?   ??? bob.rb
    ?   ??? bob_test.rb
    ??? etl
    ?   ??? etl.rb
    ?   ??? etl_test.rb
...
    ??? binary_search_tree
        ??? bst.rb
        ??? binary_search_tree.rb
        ??? README.md

由于不常见的文件夹结构,我在Guardfile中进行了以下配置:

# tell Guard to watch all folders under ruby/
all_dirs = Dir.glob('ruby/*')

directories all_dirs

options = {
  test_folders: all_dirs, 
  test_file_patterns: '*_test.rb',
  pride: true
}

guard :minitest, options do   
  watch(%r{^ruby/([^/]+)/([^/]+).rb$})
end

通过此设置,我希望在对.rb文件进行任何编辑后运行所有测试.

我在调试模式下运行后卫.

正如所料,所有测试都在启动时运行.

但是,当我编辑.rb文件时,测试不会再次运行,尽管Guard输出:

20:43:26 - DEBUG - Interactor was stopped or killed    
20:43:26 - DEBUG - Hook :run_on_additions_begin executed for Guard::Minitest
20:43:26 - DEBUG - Hook :run_on_additions_end executed for Guard::Minitest
20:43:26 - DEBUG - Start interactor

我在防护配置中尝试了很多变化,例如:

watch(%r{^ruby/([^/]+)/([^/]+).rb$}) do |m|
  Dir.glob("ruby/#{m[1]}/*_test.rb").first  
end

(我希望这只能从修改文件的文件夹中运行测试.)

似乎没什么用.我必须去守卫的交互式控制台并按下ENTER以运行测试.

我究竟做错了什么?


编辑

在阅读下面的Cezary的答案之后,我尝试了更多的东西,包括在其他环境中尝试这个.

事实证明这不是警卫的错,但可能是我正在使用的环境.

我最初在Codio盒子里运行了所有东西.我将项目移动到其他两台机器,一台Win8和一台Ubuntu 14.04,并且它在使用这个Guardfile时都能正常工作:

all_dirs = Dir.glob('ruby/*')

directories all_dirs

clearing :on

options = {
  test_folders: all_dirs, 
  test_file_patterns: '*_test.rb',
  pride: true
}

guard :minitest, options do
  watch(%r{^ruby/([^/]+)/([^/]+).rb$}) do |m|
    file = Dir.glob("ruby/#{m[1]}/*_test.rb").first
    puts "  Should test #{file}"
    file
  end
end

输出guard -d如下:

在Codio盒子里(它不起作用):



08:55:09 - DEBUG - Interactor was stopped or killed
  Should test ruby/anagram/anagram_test.rb
08:55:09 - DEBUG - Hook :run_on_additions_begin executed for Guard::Minitest
08:55:09 - DEBUG - Hook :run_on_additions_end executed for Guard::Minitest
08:55:09 - DEBUG - Start interactor
[1] guard(main)>

在Win/Ubuntu上(它工作正常):



11:02:10 - DEBUG - Interactor was stopped or killed
  Should test ruby/anagram/anagram_test.rb
11:02:10 - DEBUG - Hook :run_on_modifications_begin executed for Guard::Minitest
11:02:10 - INFO - Running: ruby/anagram/anagram_test.rb
Run options: --seed 52507

# Running tests:

..........

Finished tests in 0.001249s, 8006.0205 tests/s, 8006.0205 assertions/s.

10 tests, 10 assertions, 0 failures, 0 errors, 0 skips

11:02:10 - DEBUG - Hook :run_on_modifications_end executed for Guard::Minitest
11:02:10 - DEBUG - Start interactor
[1] guard(main)>

我不知道为什么在Codio上我得到run_on_additions了,另外两个我得到了run_on_modifications.无论如何,我猜这是一个Codio问题.我尝试使用和不使用手动保存,它也是一样的.

1 个回答
  • 嗨,我是Guard的"责备人"之一,基于此,我写了一个演练:https://github.com/guard/guard/wiki/Understanding-Guard

    我强烈建议通过它(反馈意见).

    以下列出了需要考虑的事项:

      结构:如果可以的话,将测试放在一个单独的顶级文件夹中,理想情况下,在您的示例中为'ruby/test',以及'ruby/lib'中的文件.这更接近于惯例,然后像Guard::Minitest开箱即用的东西.(有些编辑器 - 比如Vim和Emacs - 允许你在"替代"文件之间切换,他们会自动知道在哪里寻找测试或实现文件).

      Guard递归地监视目录(现在甚至无法关闭).对于小型项目,您可以通过指定directories选项来查看所有内容.但是,如果您的文件夹中有大量磁盘活动,并且您有大型项目,则需要选择目录.例如,在你的情况下,它将是:directories ruby.所以`Dir.glob('ruby/*')在这里没有多大意义.

      Guard :: Minitest选项 - 如果你使用我描述的结构,这不是必需的.如果没有,我认为test_folder: %w(ruby)应该足够了.此外,test_file_patterns不应该是必要的,因为你的文件似乎遵循默认/约定(bob_test.rbetl_test.rb) -除非你有一些奇怪的东西具有测试套件bob.rbetl.rb文件.

      您的监视表达式没有阻止,因此它返回已更改的文件.不幸的是,当你更改一个实现文件(比如bob.rb)时,会传递该文件Guard::Minitest,忽略非测试文件(可能使用该test_file_patterns选项,所以因为bob.rb不匹配bob_test.rb,所以Guard :: Minitest会悄悄地做......没有.

      理想情况下,重命名你的Guardfile,更新你的宝石(Guard::Minitest基本上)并运行bundle exec guard init minitest到那么"当前"推荐的模板是什么,Guard::Minitest并尝试调整它.您会看到默认值为:

      watch(%r{^lib/(.*/)?([^/]+)\.rb$})  { |m| "test/#{m[1]}test_#{m[2]}.rb" }
      

    它显示了如何将更改的实现文件转换为测试文件(这是唯一关注的文件Guard::Minitest).

    在您的情况下,您可能需要:

    watch(%r{^ruby/(.*/)?([^/]+)\.rb$}) { |m| "ruby/#{m[1]}/#{m[2]}_test.rb" }
    

    我想说的是使用regexen可怕 - 我计划实施glob模式支持 - 但是这将需要一段时间(许多关键bug修复的管道对我来说).

      如果这没有帮助 - 肯定要通过上面的Wiki文档,因为你可以使用Guard/Listen大约有20-50个问题 - 而且大多数都完全在Guard/Listen的控制之外.(我希望我可以改变它以使其更简单,所以任何建议都会有所帮助).

      由于错误是我的优先考虑,像大多数维护者一样 - 我们依赖于GitHub报告的问题.因此我们通常不会在Stack Overflow中观察内容(我们希望在Github中报告棘手的问题).

    好吧,我已经指出了很多错误,你做的非常非常好的时间:

      Guard在调试模式下运行- 你真的很棒

      显示有关更改的输出 - 您也很棒(因为这表明Guard :: Minitest正在获取更改,但它忽略了它们 - 可能因为您传递的是实现文件而不是测试文件).

      提交这样一个详细的问题 - 这非常有帮助.理想情况下,你不应该经历所有麻烦(或者甚至首先遇到问题),但通过报告这一点,你向我们展示了Guard在这么多层面上的问题.(通常,作为开发人员/维护人员,我们"得到"内部人员,因此我们立即"知道"什么是错误的 - 即使文档或消息或调试输出对其他人没有任何意义 - 所以这样的问题可以帮助我们非常帮助其他人).

    再次感谢您 - 如果您看到其他人有问题可以解决 - 请这样做.如果您在Guard中看到明显的错误或问题 - 请在Guard中打开一个问题.如果它在另一个插件库(如Guard::Minitest)中,请提及我,以免重要问题被忽略(@e2在GitHub上提到我).

    我希望能让Guard变得更好 - 目前我正在努力使其变得更简单,更直观,更灵活,更可靠.我可以依靠报道破碎东西的人越多,我就能越快地推进酷炫的东西.

    再次感谢,祝你有个美好的一天!

    2022-12-11 03:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有