草庐IT

unit-testing - Golang - 多个包的有效测试

coder 2024-07-06 原文

我想从我的应用程序执行所有测试,现在我用命令来执行:

go test ./app/... 

不幸的是,它需要相当长的时间,尽管单个测试运行得非常快。我认为问题在于 go 在运行测试之前需要编译每个包(及其依赖项)。

我尝试使用 -i 标志,它有点帮助,但我仍然对测试时间不满意。

go test -i ./app/... 
go test ./app/... 

您是否知道如何有效地测试多个包。

最佳答案

这就是 go test 的本质:它构建了一个特殊的运行时,其中包含要执行的附加代码(这就是它跟踪代码覆盖率的方式)。

如果速度不够快,您有两个选择:

1) 使用 bash 工具编译包列表(例如使用 ls),然后分别并行执行它们。在 bash 中有很多方法可以做到这一点。

这种方法的问题是输出会交错且难以追踪故障。

2) 在每个测试中使用 t.Parallel() 标志,以允许测试运行时并行执行。从 Go 1.5 开始,go test 运行时 GOMAXPROCS 设置为允许并发运行测试的 CPU 内核数。默认情况下,测试仍然同步运行。您必须为每个测试设置 t.Parallel() 标志,告诉运行时可以并行执行此测试。

这种方法的问题在于它假设您遵循了最佳实践并使用了 SoC/解耦,没有会在另一个测试中间发生变异的全局状态,没有互斥锁(或很少互斥锁),没有竞争条件问题(使用 -race)等

--

意见:就个人而言,我将我的 IDE 设置为在每次保存时运行 gofmtgo test -cover -short。这样,我的代码总是被格式化并且我的测试运行,只在我所在的包内,告诉我是否有失败。 -cover 标志与我的 IDE 配合使用,向我显示已测试和未测试的代码行。 -short 标志允许我编写我知道需要一段时间才能运行的测试,在这些测试中我可以检查 t.Short() bool 看我是否应该 t.Skip() 那个测试。应该有适用于您最喜欢的 IDE 的软件包来进行设置(我在 Sublime、VIM 和现在的 Atom 中进行了设置)。

这样,我在我正在编辑的包中得到即时反馈。

在提交代码之前,我会在所有包中运行所有测试。或者,我可以让 C.I.服务器做。

或者,您可以使用 -short 标志和 build 标签(例如 go test -tags integration)来重构您的测试将单元测试与集成测试分开。这就是我编写测试的方式:

  • 快速且可以并行运行的测试 <- 我使用="">go testgo test -short 让这些测试默认运行。

  • 慢速测试或需要外部组件的测试,我需要额外的输入才能运行,例如 go test -tags integration 需要运行它们。此模式不会使用普通的 go test 运行集成测试,您必须指定额外的标记。我也没有全面运行集成测试。这就是我的 CI 服务器的用途。

关于unit-testing - Golang - 多个包的有效测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38093081/

有关unit-testing - Golang - 多个包的有效测试的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  8. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

随机推荐