Хотелось бы узнать у сообщества, какие есть способы для тестирования
атомичности (atomicity) данных в условиях множества асинхронных
запросов. На конкретном примере (orm для redis) я делаю так:
https://github.com/german/redis_orm/blob/master/test/atomicity_test.rb
:
require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
class Article < RedisOrm::Base
property :title, String
property :karma, Integer
end
describe "check atomicity" do
it "should properly increment property's value" do
@article = Article.new :title => "Simple test atomicity with
multiple threads", :karma => 1
@article.save
@threads = []
50.times do |i|
@threads << Thread.new(i) do
@article.update_attribute :karma, (@article.karma + 1)
end
end
@threads.each{|thread| thread.join}
Article.first.karma.should == 51
end
end
Правильно ли это? Какие еще тесты можно добавить?
On Thursday, July 28, 2011 at 4:12 PM, germans_in_the_town wrote:
Добрый день.
Хотелось бы узнать у сообщества, какие есть способы для тестирования
атомичности (atomicity) данных в условиях множества асинхронных
запросов. На конкретном примере (orm для redis) я делаю так:
https://github.com/german/redis_orm/blob/master/test/atomicity_test.rb
:
require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
class Article < RedisOrm::Base
property :title, String
property :karma, Integer
end
describe "check atomicity" do
it "should properly increment property's value" do
@article = Article.new :title => "Simple test atomicity with
multiple threads", :karma => 1
@article.save
@threads = []
50.times do |i|
@threads << Thread.new(i) do
@article.update_attribute :karma, (@article.karma + 1)
end
end
@@threads.each{|thread| thread.join}
Article.first.karma.should == 51
end
end
Правильно ли это? Какие еще тесты можно добавить?
--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
On Jul 28, 4:34 pm, "a.ognevsky" <a.ognev...@gmail.com> wrote:
> Я буквально вчера на сайте редиса игрался с обучающей консолькой и там рассказывалось, что @article.karma + 1 -- хреновый вариант, ибо он как раз не атомарный. Для этого там использовался increment.
@article = Article.create :title => "Simple test atomicity with multiple threads", :karma => 1
karma = @article.karma
@article.update_attribute :karma, karma + 1
@article.update_attribute :karma, karma + 1
@article.reload.karma.should == 3
Угу, теперь сразу видно, что тест глупый и не пройдет. Можно поменять karma на @article.karma, тогда тест пройдет (, но менее глупым не станет.
Давайте определимся, для начала, а что собственно вы хотите протестировать? Атомарные операции это фишка СУБД, а не драйвера или библиотеки (ну т.е. их можно сделать и на этом уровне, но это было бы несколько глупо, в редисе атомарный инкремент, на сколько мне известно, и так есть), работу драйвера / библиотеки при множестве тредов, умение драйвера / библиотеки посылать INCRBY при соответствующем вызове? В зависимости от ответа будут и соответствующие тесты. А на сколько INCRBY действительно атомарна при параллельных запросах нужно проверять в тестах самого редиса (собственно юнит-тестами в клиенте вы это и не проверите).
да хотел потестить работу библиотеки именно при множестве тредов. INCR
как команда редиса, понятное дело, работает нормально при
асинхронности. хотелось бы узнать какие еще могут быть подводные камни
(например кроме INCR)