Усиливают ли крупные предприятия насмешливость/обуздание?

Кто-нибудь работал в крупной компании или на очень большом проекте, который успешно использовал модульное тестирование?

Наша текущая база данных имеет ~ 300 таблиц с ~ 100 совокупными корнями. В целом есть ~ 4000 столбцов, и у нас будет ~ 2 миллиона строк кода по завершении. Мне было интересно - действительно ли компании с базами данных такого размера (или намного больше) на самом деле выполняют усилия по Mock/Stub для доменных объектов для тестирования? Прошло два года с тех пор, как я работал в крупной компании, но в то время все крупные приложения тестировались с помощью интеграционных тестов. Групповое тестирование было, как правило, неодобрительным, если оно требовало большой настройки.

Я начинаю чувствовать, что модульное тестирование - это пустая трата времени на что-либо, кроме статических методов, так как многие наши методы тестирования занимают столько же или больше времени, сколько и фактический код... в частности, настройка/организация шаги. Чтобы усугубить ситуацию, один из наших разработчиков продолжает ссылаться на то, как методы Unit Testing и Agile были такими неудачными неудачами в проекте Kent Beck Chrysler... и что это просто не методология, которая хорошо масштабируется.

Любые ссылки или опыты были бы замечательными. Менеджменту нравится идея Unit Testing, но если они видят количество дополнительного кода, который мы пишем (и наше разочарование), они с радостью откажутся.

Ответ 1

Я видел, как TDD очень хорошо работает над крупными проектами, особенно для того, чтобы помочь нам получить базу устаревшего кода под контролем. Я также видел работу Agile в широких масштабах, хотя, как мне кажется, недостаточно практики Agile. Ричард Дурналл написал отличный пост о том, как вещи ломаются в компании, поскольку Agile получает прибыль. Я подозреваю, что Lean может лучше подходить на более высоких уровнях в организации. Конечно, если культура компании не подходит для Agile к тому времени, когда она начнет использоваться в нескольких проектах, она не сработает (но ничто другое не приведет к тому, что вы получите компанию, которая не сможет эффективно реагировать на изменения в любом случае).

В любом случае, обратно в TDD... Тестирование автономных блоков кода иногда может быть сложным, и если есть большой объект, связанный с данными, я часто не издеваюсь над ним. Вместо этого я использую шаблон построителя, чтобы упростить правильное определение этого домена.

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

Для меня цель написания модульных тестов не предназначена для регрессионного тестирования. Это помогает мне думать о поведении кода, его обязанностях и о том, как он использует другие фрагменты кода, чтобы помочь ему делать то, что он делает. Он предоставляет документацию для других разработчиков и помогает мне сохранить мой дизайн в чистоте. Я думаю о них как о примерах того, как вы можете использовать кусок кода, почему он ценен и какое поведение вы можете ожидать от него.

Подумав об этом, я склонен писать тесты, которые делают код легким и безопасным для изменения, вместо того, чтобы фиксировать его, чтобы никто не мог его сломать. Я обнаружил, что сосредоточение внимания на издевательствах всего, особенно объектов домена, может вызвать довольно хрупкие тесты.

Цель TDD не тестировать. Если вы хотите что-то проверить, вы можете получить тестер, чтобы посмотреть на него вручную. Единственная причина, по которой тестировщики не могут это делать каждый раз, состоит в том, что мы продолжаем изменять код, поэтому цель TDD - сделать код легко меняющимся. Если ваш TDD не облегчает вам задачу, найдите другой способ сделать это.

Ответ 2

У меня был хороший опыт работы с макетными объектами и модульным тестированием в проектах, где было много авангардного дизайна и удобной временной шкалы для работы - к сожалению, это часто роскошь, которую большинство компаний не могут позволить себе риск на. Методы GTD и GTDF также не помогают решить эту проблему, поскольку они ставят разработчиков на беговую дорожку.

Большая проблема с модульными тестами заключается в том, что если вы не покупаете у целой команды, что происходит, один разработчик смотрит на код с розовыми очками (и не по своей вине) реализует только счастливый путь которые они могут придумать. Единичные тесты не всегда поддерживаются так же хорошо, как и должны, потому что угловые случаи проскальзывают, и не все пьют Kool-Aid. Тестирование - это совсем другое мышление, чем придумывание алгоритмов, и многие разработчики действительно просто не знают, как это думать.

Когда итерации и циклы разработки жесткие, я нахожу себя более уверенным в качестве кода, полагаясь на инструменты статического анализа и инструменты сложности. (FindBugs, PMD, Clang llvm и т.д.) Даже если они находятся в областях, которые вы не можете напрямую адресовать, вы можете обозначить их как наземные мины и помочь лучше определить риск при реализации новых функций в этой области.

Ответ 3

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

Я бы рефакторинг.

У меня большое приложение и не вижу проблем при написании блок-тестов, и когда я это знаю, время рефакторирования.

Конечно, в интеграционном тесте нет ничего плохого. На самом деле у меня тоже есть те, кто проверяет DAL или другие части приложения.

Все автоматические тесты должны формировать целое, unittest - это лишь часть этих.

Ответ 4

Да, они делают. Довольно подробно.

Тяжелая часть получает дисциплину на месте, чтобы писать чистый код - и (еще более твердую часть) дисциплины , чтобы отламывать плохой код путем рефакторинга, когда вы идете.

Я работал в одном из крупнейших мировых банков по проекту, который использовался из Нью-Йорка, Лондона, Парижа и Токио. Он использовал издевки очень хорошо, и благодаря большому количеству дисциплины у нас был довольно чистый код.

Я сомневаюсь, что это издевательство - это просто простой инструмент. Если вам нужно сильно полагаться на них, скажите, что вам кажется, что вам нужны издевательства над макетами, возвращающими насмешки, - тогда что-то пошло не так с тестом или кодом...