Как можно протестировать атомичность данных?

31 views
Skip to first unread message

germans_in_the_town

unread,
Jul 28, 2011, 9:12:54 AM7/28/11
to RubyOnRails to russian
Добрый день.

Хотелось бы узнать у сообщества, какие есть способы для тестирования
атомичности (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

Правильно ли это? Какие еще тесты можно добавить?

a.ognevsky

unread,
Jul 28, 2011, 9:34:11 AM7/28/11
to ror...@googlegroups.com
Я буквально вчера на сайте редиса игрался с обучающей консолькой и там рассказывалось, что @article.karma + 1 — хреновый вариант, ибо он как раз не атомарный. Для этого там использовался increment. 

Или я что-то не так понял и путаю?

--
Andrey Ognevsky

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

germans_in_the_town

unread,
Jul 28, 2011, 9:54:23 AM7/28/11
to RubyOnRails to russian
Да, непосредственно @article.karma + 1 - плохо. И как раз нужны тесты
для таких плохих случаев. Чтобы знать, что нужно поправить на
глубинном уровне (в самой библиотеке)

On Jul 28, 4:34 pm, "a.ognevsky" <a.ognev...@gmail.com> wrote:
> Я буквально вчера на сайте редиса игрался с обучающей консолькой и там рассказывалось, что @article.karma + 1 -- хреновый вариант, ибо он как раз не атомарный. Для этого там использовался increment.

Andrew Rudenko

unread,
Jul 28, 2011, 3:32:54 PM7/28/11
to ror...@googlegroups.com
Ну так и напишите тест на то, что проверяете:

@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 действительно атомарна при параллельных запросах нужно проверять в тестах самого редиса (собственно юнит-тестами в клиенте вы это и не проверите).

germans_in_the_town

unread,
Jul 28, 2011, 4:57:11 PM7/28/11
to RubyOnRails to russian
> работу драйвера / библиотеки при множестве тредов, умение драйвера / библиотеки посылать INCRBY при соответствующем вызове?

да хотел потестить работу библиотеки именно при множестве тредов. INCR
как команда редиса, понятное дело, работает нормально при
асинхронности. хотелось бы узнать какие еще могут быть подводные камни
(например кроме INCR)

Akzhan Abdulin

unread,
Jul 28, 2011, 5:27:07 PM7/28/11
to ror...@googlegroups.com
Это же не тестами делается, а изучением соответствующего курса... IPC.

29 июля 2011 г. 0:57 пользователь germans_in_the_town <germani...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages