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

Я разрабатываю межплатформенный проект, который поддерживал бы:

  • Четыре компилятора C++ - GCC, MSVC, SunStudio, Intel,
  • Пять операционных систем: Linux, OpenSolaris, FreeBSD, Windows, Mac OS X.

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

Однако, поскольку Вы все знаете, что модульные тесты записи являются чрезвычайно скучными, и замедлите процесс разработки (потому что это скучно, и разработка программного обеспечения FOSS не должна быть таким),

Как Вам удается написать хороший код поблочного тестирования и не написание кода остановки.

Если Вы, по крайней мере, получаете зарплату для этого, можно сказать - по крайней мере, я получаю что-то для этого, но если Вы не делаете, это намного более твердо!

Разъяснение:

Я понимаю, что TDD должен быть ключом, но TDD имеет после очень строгих ограничений:

  1. У Вас есть точные спецификации.
  2. Вы полностью определили API.

Это верно для проекта, который разрабатывается в стиле клиента-поставщика, но он не может быть сделан для проекта, который развивается.

Иногда для решения, что функция, мне нужно, я должен создать что-то и понять, работает ли она хорошо, если API подходит и помогает мне, или это ужасно и не удовлетворяет меня.

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

Это - очень отличающийся стиль разработки, которая противоречит TDD.

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

12
задан 2 revs 7 February 2010 в 10:10
поделиться

7 ответов

Это приблизительное предположение, но я думаю, что речь идет о связи массива с его универсальным IEnumerable.

В .NET Framework версии 2.0 Класс Array реализует Система. Коллекции. Универсальный. IList, Система. Коллекции. Универсальный. ICollection, и Система. Коллекции. Универсальный. IEnumerable общие интерфейсы. реализации предоставляются массивам во время выполнения и, следовательно, не видна для сборки документации инструменты. В результате родовая модель интерфейсы не отображаются в синтаксис объявления для массива класс, и ссылки отсутствуют темы для членов интерфейса, которые являются доступно только путем приведения массива к универсальный тип интерфейса (явный реализации интерфейса). Ключ вещь, о которой нужно знать, когда вы бросаете массив к одному из этих интерфейсов члены, которые добавляют, вставляют или удалить метание элементов NotSupportedException.

См. статью MSDN .

Неясно, относится ли это к .NET 2.0 +, но в этом особом случае было бы совершенно понятно, почему компилятор не может оптимизировать ваше выражение, если оно становится действительным только во время выполнения.

-121--1337644-

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

Чтобы восстановить привязку в VS 2010, перейдите в меню Файл - > Управление версиями - > Изменить управление версиями. Найдите «Solution: your solution name » (Решение: имя вашего решения ), и если оно не связано, оно будет содержать слово «no server» (нет сервера). Щелкните на нем, а затем на панели инструментов нажмите «Bind».

в Visual Studio 2012/2013 это Файл - > Управление версиями - > Дополнительно - > Изменение управления версиями (благодаря danglund).

Это должно создать новый файл vssscc, который правильно привязан. Теперь добавьте новый проект и все должно работать правильно.

-121--865258-

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

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

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

4
ответ дан 2 December 2019 в 21:43
поделиться

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

Проблемы могут заключаться в

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

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

TDD - не панацея. Это может быть реализовано ужасным образом. Он не должен становиться флажком в контрольном списке вашего проекта.

4
ответ дан 2 December 2019 в 21:43
поделиться

Модульные тесты должны следовать всем лучшим практикам производственного кода, таким как принцип DRY. Если вам надоест писать модульные тесты, вам также станет скучно писать производственный код.

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

1
ответ дан 2 December 2019 в 21:43
поделиться

Попробуйте использовать TDD (разработка через тестирование) - вместо написания тестов после того, как собственно кодирование было завершено, напишите их раньше и позвольте им управлять вашим дизайном.

Из-за природы проекта требуется изрядная автоматизация - найдите способ написать тест один раз для одной ОС / компилятора, а затем запустить его для всех остальных доступных опций.

0
ответ дан 2 December 2019 в 21:43
поделиться

напишите их, переходя от модульных тестов к коду, к модульному тесту к коду ... и так далее.

1
ответ дан 2 December 2019 в 21:43
поделиться

Учитывали ли вы nested_attributes для моделей рельсов? Вместо нескольких новых форм обратной связи, каждая из которых связана с аннотацией, можно использовать несколько редактируемых форм аннотации, в которых каждая аннотация включает поля для новой обратной связи. Идентификаторы созданных форм будут включать идентификаторы аннотаций, например edit _ annotation _ 16 .

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

class Annotation < ActiveRecord::Base
  has_many :feedbacks
  accepts_nested_attributes_for :feedbacks
end

class Feedback < ActiveRecord::Base
  belongs_to :annotation
end

Затем можно добавить любое количество форм, по одной для каждой аннотации. Например, это то, что я пытался:

<% form_for @a do |form| %>
    Lyrics: <br />
    <%= form.text_field :lyrics %><br />
    <% form.fields_for :feedbacks do |feedback| %>
        Feedback: <br/>
        <%= feedback.text_field :response %><br />
    <% end %>
    <%= form.submit "Submit" %>
<% end %>

<% form_for @b do |form| %>
    Lyrics: <br />
    <%= form.text_field :lyrics %><br />
    <% form.fields_for :feedbacks do |feedback| %>
        Feedback: <br/>
        <%= feedback.text_field :response %><br />
    <% end %>
    <%= form.submit "Submit" %>
<% end %>

И быстрый и грязный контроллер для вышеприведенного вида редактирования:

class AnnotationsController < ApplicationController
  def edit
    @a = Annotation.find(1)
    @a.feedbacks.build
    @b = Annotation.find(2)
    @b.feedbacks.build
  end

  def update
    @annotation = Annotation.find(params[:id])
    @annotation.update_attributes(params[:annotation])
    @annotation.save!
    render :index
  end
end
-121--3802360-

записать их прыжки от единичных тестов к коду к единичному тесту к коду... и так далее.

-121--3505004-

Лично я нахожу написание кода, который, как я знаю, очень волнует. Но если вы не хотите, чтобы вам было скучно писать единичные тесты, то вам нужно будет культивировать увлечение для отладки.

Чтобы быть серьезным, если вы считаете, что тесты на записи скучны и медленны, вам действительно нужно переосмыслить, как вы пишете их. Я предлагаю вам изучить использование Test Driven Development. Запишите тесты на языке программирования и запустите их автоматически. Используйте отзывы тестов для формирования кода.

Существуют фреймворки Test First для практически любого языка, который вы хотите упомянуть, вдохновленные работой Кента Бека и Эриха Гаммы с JUnit. Статья Википедии на TDD имеет больше информации, включая полезную ссылку на список фреймворков, организованных по языку. Подробнее .

1
ответ дан 2 December 2019 в 21:43
поделиться

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

1
ответ дан 2 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: