Я прихильник випадкових тестів, і я їх пишу. Однак, чи підходять вони в конкретних умовах побудови та до яких тестових наборів вони повинні бути включені, є більш нюансованим питанням.
Запускайте локально (наприклад, протягом ночі у вашому скриньці розроблених), рандомізовані тести виявили помилки як очевидні, так і незрозумілі. Незрозумілі з них є прихованими, що, на мою думку, випадкове тестування було справді єдиним реалістичним, що їх вимило. В якості тесту я взяв одну з важких помилок, виявлених за допомогою рандомізованого тестування, і півтора десятка розробників тріщин переглянули функцію (близько десятка рядків коду), де вона сталася. Жоден не зміг її виявити.
Багато ваших аргументів проти рандомізованих даних є ароматами "тест не відтворюється". Однак, добре складений рандомізований тест дозволить зафіксувати насіння, яке використовується для запуску рандомізованого насіння, і виведе його після відмови. На додаток до того, що ви можете повторити тест вручну, це дозволяє тривіально створити новий тест, який перевіряє конкретну проблему шляхом жорсткого кодування насіння для цього тесту. Звичайно, мабуть, приємніше вручити чіткий тест, що охоплює цей випадок, але лінь має свої чесноти, і це навіть дозволяє вам по суті автоматично генерувати нові тестові випадки з невдалого насіння.
Єдиний момент, який ви зазначаєте, що я не можу обговорювати, це те, що він порушує системи збирання. Більшість тестів на побудову та постійну інтеграцію очікують, що тести будуть робити те саме, щоразу. Тож тест, який випадково виходить з ладу, створить хаос, випадково провалившись і вкажіть пальці на зміни, які були нешкідливими.
Тоді рішення полягає в тому, щоб все-таки запускати свої рандомізовані тести як частину тестів збірки та CI, але запускати їх із фіксованим насінням, за фіксовану кількість ітерацій . Отже, тест завжди робить те ж саме, але все ж досліджує купу вхідного простору (якщо ви запускаєте його для декількох ітерацій).
Місцево, наприклад, змінюючи відповідний клас, ви можете запустити його для більш ітерацій або з іншими насінням. Якщо рандомізоване тестування коли-небудь стане більш популярним, ви навіть можете уявити собі певний набір тестів, які, як відомо, є випадковими, які можна проводити з різними насінням (отже, із збільшенням покриття з часом), і де збої не означатимуть те саме як детерміновані системи CI (тобто, запуски не асоціюються 1: 1 зі змінами коду, тому ви не вкажете пальцем на певну зміну, коли все не виходить з ладу).
Для рандомізованих тестів можна сказати багато, особливо добре написаних, тому не варто занадто швидко їх звільняти!