Как стать автором
Обновить

Комментарии 27

НЛО прилетело и опубликовало эту надпись здесь
Много забавного поймали :)

Например, опечатки в assert-ах:
assertCount(1, count($some_var)); //до php 7.2 спокойненько себе всегда проходила
assertTrue(true, $some_var);

Еще находились кусочки кода, в тестах для которых вообще не покрыты граничные условия, при этом code coverage близился к 100%.
Была даже пара тестов которые при любом изменении тестируемого кода проходили ¯\_(ツ)_/¯

В целом, такие ошибки на большом и старом проекте будут всегда возникать, мутационные тесты помогут их выявлять и держать под контролем.

Но главное — мутационное тестирование поможем вам начать писать более качественные тесты прям со старта.
Еще находились кусочки кода, в тестах для которых вообще не покрыты граничные условия, при этом code coverage близился к 100%.

Кстати хороший пример, почему даже серьезное покрытие тестами ещё ничего не гарантирует :).
НЛО прилетело и опубликовало эту надпись здесь
Честно сказать, не представляю как давать такие подсказки :)
Это ресурсоемко, но не неподъемно как кажется на первый взгляд, попробуйте.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Я больше чем уверен, что эти цифры приведены в качестве примера. Даже когда я ещё работал в Badoo (около 3 лет назад) было около 60 тысяч юнит тестов и они шли порядка 100 минут, если посчитать суммарно время выполнения всех из них (но при этом они выполнялись параллельно и проходили за пару минут). На первый взгляд может показаться, что там действительно нечего тестировать, но на самом деле вы видите только вершину айсберга и на деле кода в Badoo очень много и его нужно тестировать :).

НЛО прилетело и опубликовало эту надпись здесь
Вы безусловно правы, в идеальных условиях именно столько должны бежать юниты. Но проект огромный, много тестов писалось на заре развития юнит тестирования, не самым оптимальным способом. Все это приводится в порядок, новый код пишется так чтобы тесты для него были быстрые и блестящие, но это процесс не быстрый.
НЛО прилетело и опубликовало эту надпись здесь
Есть метрика, есть отчеты в разрезах команд, компонентов и прочего :)

Никто не относится к ним как к артефактам, мы ведем работу над их улучшением, я всего лишь говорю вам о том, что есть некий «багаж», который нужно разобрать. Мы вкладываем в это время и ресурсы, но не в ущерб остальным процессам.

Не-не, дискуссии это прекрасно. Никто и не говорит что решение X лучше Y. X — способ существовать сейчас, Y — светлое будущее достижение которого требует времени. К тому же, решение Х еще позволяет запускать функциональные и end-to-end тесты, которые нельзя сделать сильно быстрыми.

НЛО прилетело и опубликовало эту надпись здесь
Как уже написал youROCK выше, это всего лишь пример взятый из головы.

В Badoo по состоянию на сегодня 71 000 тестов (полгода назад было чуть больше 100 000), в результате оптимизаций и пересмотра мы немного уменьшили их количество, но сильно подтянули по скорости работы. Сейчас они пробегаю за 35-40 секунд на нашем тестовом облаке.
Скорость действительно впечатляет. Это только unit тесты, или среди них есть еще и функциональные, тесты, работающие с БД, http запросами? Расскажите по-подробней, пожалуйста.

И каковы основные приемы ускорения, кроме параллелизации?
Это только Unit-тесты.
Есть еще 19 000 функциональных, на облаке сейчас пробегают за 3-5 минут, но мы еще не брались за их оптимизации.
И примерно 6 300 end-to-end тестов, бегают около 10 минут сейчас, активно оптимизируем.

Грамотная параллелизация это 80% успеха, это намного сложнее чем кажется. Нужно правильно разбить сьют по тредам, эффективно чекаутить рабочие копии, разбираться с экстра длинными тест-кейсами, следить за равномерностью нагрузки машин клауда и прочие радости.

Для юнитов мы сделали еще несколько финтов.
Первое, запретили ходить в сеть на уровне кода, ибо раньше в юните совершенно случайно могли случаться походы в мемкэш или базы, в какие-либо демона. Сейчас любой поход в сеть внутри юнит теста заканчивается выбросом эксепшена и падением теста. Это сделало юниты сильно стабильнее, и ускорило, так как походы в сеть основной источник энтропии во времени прогона.

Второе, максимально облегчили изначально тяжелый базовый тест-кейс. Например исторически мы на tearDown чистили большой список классов со статик кэшами и синглтонами (которые еще остались со времен когда это было модно :)). Мы пересмотрели этот подход, перестали их чистить на каждый чих и просто наладили мониторинг за тестами — если тест оставляет за собой грязный контекст — мы это быстро обнаруживаем.
Я не думаю, что основная архитектура параллельного запуска не особо изменилась. Я о ней писал статью: m.habr.com/ru/company/badoo/blog/220211
НЛО прилетело и опубликовало эту надпись здесь
Все так. Около 2 часов полный прогон занимает. Поэтому мы считаем этот отчет ночью.
А в течении дня считаем только для branch diff и сравниваем с мастером (который рассчитали ночью)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
1. Есть ли у вас новые какие-то мутаторы по сравнению с Infection? Если да, не хотите ли вы контрибьютнуть обратно?
2. Забираете ли вы к себе наши новые мутаторы, когда они добавляются в Infection?

Мы думаем о выделении набора мутаторов в отдельный package, что бы можно было их проще использовать всем, кому захочется, и что бы было возможно всем (а не только нам) их и саппортить / обновлять.
1. Пока ничего нового не придумали :) Но если придумаем — обязательно законтрибьютим!
2. Я обновлял их только один раз, в текущем исполнении это немножко нудно, а текущий набор мутаторов нас устраивает

Это было бы круто! В таком исполнении мы бы просто подключили их через композер как зависимость и регулярно обновляли.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории