首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试并发特性

测试并发特性
EN

Stack Overflow用户
提问于 2011-11-17 07:47:10
回答 3查看 1.3K关注 0票数 4

如何测试具有并发特性的Ruby代码?例如,让我们假设我有一个可以防止死锁的同步机制。有没有一种可行的方法来测试它的真正作用?纤程中的受控执行可能是前进的方向吗?

EN

回答 3

Stack Overflow用户

发布于 2012-07-15 06:27:00

我遇到了完全相同的问题,并且实现了一个使用断点同步子流程的简单gem:http://github.com/remen/fork_break

我还在http://www.hairoftheyak.com/testing-concurrency-in-rails/上记录了rails3的一个高级使用场景

票数 3
EN

Stack Overflow用户

发布于 2011-11-23 13:27:12

我需要确保我创建的gem (redis-native_hash)能够处理对相同Redis散列的并发写入,检测竞争条件,并优雅地进行恢复。我发现要测试这一点,我根本不需要使用线程。

代码语言:javascript
复制
it "should respect changes made since last read from redis" do
  concurrent_edit = Redis::NativeHash.find :test => @hash.key
  concurrent_edit["foo"] = "race value"
  concurrent_edit.save
  @hash["yin"] = "yang"
  @hash["foo"] = "bad value"
  @hash.save
  hash = Redis::NativeHash.find :test => @hash.key
  hash["foo"].should == "race value"
  hash["yin"].should == "yang"
end

在此测试用例中,我只是实例化了另一个对象,该对象表示Redis散列的并发编辑,让它进行更改,然后确保保存指向相同散列的已有对象会考虑这些更改。

并不是所有涉及并发性的问题都可以在不实际使用并发性的情况下进行测试,但在这种情况下是可能的。您可能希望尝试寻找类似的东西来测试您的并发解决方案。如果可能的话,这绝对是一条更容易的路线。

票数 2
EN

Stack Overflow用户

发布于 2014-10-31 04:39:29

这绝对是一个困难的问题。我开始使用线程编写测试,并意识到我正在测试的代码的实现方式,我需要进程I (PID)实际上是不同的。线程使用与启动线程的进程相同的PID运行。学到的教训。

正是在这一点上,我开始探索forks,并遇到了这个堆栈溢出线程,并使用了fork_break。非常酷,而且很容易设置。虽然我所做的事情不需要断点,但我只想让进程并发运行,使用断点在未来可能非常有用。我遇到的问题是,我一直在使用EOFError,但我不知道为什么。因此,我开始自己实现forking,而不是通过fork_break,并发现在测试的代码中发生了异常。遗憾的是,堆栈跟踪被EOFError隐藏起来了,尽管我知道子进程突然结束了,这就是它的运行方式。

我遇到的下一个问题是DatabaseCleaner。无论它使用哪种策略(截断或事务),子进程的数据在子进程完成时被截断/回滚,因此子进程插入的数据消失了,父进程无法选择和验证它是否正确。

在尝试了很多其他不成功的事情后,我偶然发现了这个帖子http://makandracards.com/makandra/556-test-concurrent-ruby-code,它几乎和我已经在做的事情一模一样,只是增加了一点。呼喊"Process.exit!“在叉子的尽头。我最好的猜测(基于我对forking的有限理解)是,这会导致进程突然结束,以至于当子进程结束时,它会完全绕过任何类型的数据库清理。因此,我的父流程,即实际的测试,可以继续并验证它需要验证的数据。然后,在测试的正常后钩子期间(在本例中是cucumber,但也可以很容易地使用rspec ),数据库清理器启动并清理数据,就像通常的测试一样。

所以,我想分享一下我自己在关于如何测试并发特性的讨论中学到的一些经验。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8160366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档