четверг, 28 июля 2011 г.

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

Ну так и напишите тест на то, что проверяете:

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

On Jul 28, 2011, at 5:54 PM, germans_in_the_town wrote:

> Да, непосредственно @article.karma + 1 - плохо. И как раз нужны тесты
> для таких плохих случаев. Чтобы знать, что нужно поправить на
> глубинном уровне (в самой библиотеке)
>
> On Jul 28, 4:34 pm, "a.ognevsky" <a.ognev...@gmail.com> wrote:
>> Я буквально вчера на сайте редиса игрался с обучающей консолькой и там рассказывалось, что @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
>>
>>> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
>>> ror2ru@googlegroups.com
>>> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
>>> Дополнительные варианты находятся на странице группыhttp://groups.google.com/group/ror2ru?hl=ru
>
> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
>
> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> ror2ru@googlegroups.com
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
> Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ

Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror2ru@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

Комментариев нет:

Отправить комментарий