Size: a a a

Saint P Ruby Community

2020 March 18

NS

Nikita Shilnikov in Saint P Ruby Community
Ещё *args аллоцирует массив, много чести для такого утилитарного модуля, ещё и на каждый вызов. В 2.7 есть ..., но этот код для любой поддерживаемой версии, даже define_method я вызвал через send
источник

RI

Rustam Ibragimov in Saint P Ruby Community
важно понимать, что с такой реализацией два синхронайзед метода при вызове одним другого будут вызывать дедлок

может, лучше reentrant lock 🤔
источник

NS

Nikita Shilnikov in Saint P Ruby Community
важно понимать, что глобальный мутабельный апи это плохо ;)
источник

RI

Rustam Ibragimov in Saint P Ruby Community
это тоже :)
источник

n

nononoy in Saint P Ruby Community
Народ, кто использует rspec без database_cleaner. Тип в спеках работаем только с тем, что генерим, и не заботимся об очистке БД из-за перфоманса. Какие есть подводные камни у такого подхода?
источник

RI

Rustam Ibragimov in Saint P Ruby Community
то, что у тебя состояние между спеками сохраняется - большой булыжник, а не камень
источник

n

nononoy in Saint P Ruby Community
мм но формально же ничего не мешает факторить данные исключительно для конкретного спека и в рамках этого работать. а так для каждого интеграционного спека пришлось бы делать каждый раз один большой сетап. Я сам не поклонник такого подхода, но мб кто работал по такой схеме и может поделиться личными кошмарами?
источник

m

max in Saint P Ruby Community
Nikita Shilnikov
Че-то ты не понял, что мьютекс на инстанс делается, все остальное вкусовщина
упс, да. мьютекс получился на все инстансы =\
просто мне не нравится что этот мьютекс протекает в класс и доступен там как instance variable
тогда надо делать еще одну обертку типа
module Sync
 def initialize(*)
   singleton_class.prepend SynchronizedAccess.new
   super
 end
end

class Foo
 include Sync
end

заодно починим наследование, потому что в обоих случая class Bar < Foo; def foo; end end работать не будет

еще я жутко не люблю _eval и _exec и стараюсь от них избавиться
хотя define_method по сути тоже eval, но это необходимое зло, и если бы было можно - с радостью бы избавился
источник

RI

Rustam Ibragimov in Saint P Ruby Community
nononoy
мм но формально же ничего не мешает факторить данные исключительно для конкретного спека и в рамках этого работать. а так для каждого интеграционного спека пришлось бы делать каждый раз один большой сетап. Я сам не поклонник такого подхода, но мб кто работал по такой схеме и может поделиться личными кошмарами?
можно, но если у тебя будет какой-нибудь домен статистики,  и там будет юнит калькулирующий глобальную статистику - то будет уже не очень
источник

RI

Rustam Ibragimov in Saint P Ruby Community
max
упс, да. мьютекс получился на все инстансы =\
просто мне не нравится что этот мьютекс протекает в класс и доступен там как instance variable
тогда надо делать еще одну обертку типа
module Sync
 def initialize(*)
   singleton_class.prepend SynchronizedAccess.new
   super
 end
end

class Foo
 include Sync
end

заодно починим наследование, потому что в обоих случая class Bar < Foo; def foo; end end работать не будет

еще я жутко не люблю _eval и _exec и стараюсь от них избавиться
хотя define_method по сути тоже eval, но это необходимое зло, и если бы было можно - с радостью бы избавился
лучше спокойно написать свой лок и юзать его явно
источник

IM

Igor Morozov in Saint P Ruby Community
nononoy
мм но формально же ничего не мешает факторить данные исключительно для конкретного спека и в рамках этого работать. а так для каждого интеграционного спека пришлось бы делать каждый раз один большой сетап. Я сам не поклонник такого подхода, но мб кто работал по такой схеме и может поделиться личными кошмарами?
если беспокоит большой сетап и «данные исключительно для конкретного спека», можешь использовать стандартные фикстурки — они достаточно быстрые — и стартовать БД транзакцию перед выполнением каждого отдельного теста, а не всего суита

а так, перформанс тестов может выбиться в перформанс команды, из-за того, что тесты писать привычным образом часто не получится

но если оставите артефакт в виде статьи / доклада — будет огонь
источник

m

max in Saint P Ruby Community
тут вся история вокруг того как не писать свой лок, а сделать хелпер =)
источник

n

nononoy in Saint P Ruby Community
Igor Morozov
если беспокоит большой сетап и «данные исключительно для конкретного спека», можешь использовать стандартные фикстурки — они достаточно быстрые — и стартовать БД транзакцию перед выполнением каждого отдельного теста, а не всего суита

а так, перформанс тестов может выбиться в перформанс команды, из-за того, что тесты писать привычным образом часто не получится

но если оставите артефакт в виде статьи / доклада — будет огонь
да нужно постоянно смотреть, что ты именно со своими данными работаешь. И не можешь использовать условные User.all потому что там будет куча не тобой созданных юзеров.
источник

TL

Tab Loid in Saint P Ruby Community
Идея: каждому тесту своя база, все будет моментально!
источник

TL

Tab Loid in Saint P Ruby Community
С учетом того что люди для локальной разработки у себя k8s кластер поднимают, не удивлюсь если кто-то сделает что-то подобное=)
источник

VD

Vla Dem in Saint P Ruby Community
nononoy
Народ, кто использует rspec без database_cleaner. Тип в спеках работаем только с тем, что генерим, и не заботимся об очистке БД из-за перфоманса. Какие есть подводные камни у такого подхода?
Почему не используете транзакции? Быстро и без глобального состояния.
источник

n

nononoy in Saint P Ruby Community
Vla Dem
Почему не используете транзакции? Быстро и без глобального состояния.
Архитектурные технические решения принимаю не я. Я бы заюзал транзакции. Теперь я хочу понять с чем придется столкнуться, и как миниммизировать неудобства, мб кто прошел через это и имеет гештальт.
источник

MS

Mikhail Sytchev in Saint P Ruby Community
Vla Dem
Почему не используете транзакции? Быстро и без глобального состояния.
есть статья в которой описывается как за счет транзакций избавиться от глобоального состояния в тестах?
источник

n

nononoy in Saint P Ruby Community
Схема такая - после сборки на CI и CD, собирается докер образ с заполненной бд, который юзается как бд для дев и для тест. И в тестах дополнительно создаются данные в каждой спеке, ты с ними работаешь, но не удаляешь database_cleanerом
источник

n

nononoy in Saint P Ruby Community
Был у кого похожий опыт, и если был, то как справлялись)
источник