Пример кода автоматического модульного теста - PullRequest
11 голосов
/ 19 ноября 2008

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

/// <summary>Summary here</summary>
/// <example>Here is an example  <code>example code here</code> </example>
public void SomeFunction() 

Затем мы используем Sandcastle и создаем необходимые файлы справки (chm и веб-сайт).

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

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

Ответы [ 4 ]

9 голосов
/ 19 ноября 2008

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

/// <summary>Summary here</summary>
/// <example>Here is an example
/// <code>!!sourcefile:SomeClassTest.cs#SomeFunction!!</code></example>
public void SomeFunction()

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

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

Конечно, это предполагает, что примеры кода легко тестируются модулем, а некоторые могут и не быть (если они имеют дело с ресурсами и т. Д.). По крайней мере, вы бы знали, что он компилируется:)

8 голосов
/ 03 марта 2009

Да, sandcastle поддерживает это, и здорово поддерживать правильность примеров. Вы можете указать область кода следующим образом:

   /// <summary>
   /// Gizmo which can act as client or server.
   /// </summary>
   /// <example>
   /// The following example shows how to use the gizmo as a client:
   /// <code lang="cs"
   ///    source="..\gizmo.unittests\TestGizmo.cs"
   ///    region="GizmoClientSample"/>
   /// </example>
   public class Gizmo

Затем вы можете использовать тестовый код в TestGizmo.cs в качестве примера, заключив его в область:

[Test]
public GizmoCanActAsClient()
{
   #region GizmoClientSample
   Gizmo gizmo = new Gizmo();
   gizmo.ActAsClient();
   #endregion
}

Предупреждение: если вы переместите или переименуете тестовый файл, вы получите сообщение об ошибке только при попытке восстановить документацию с помощью sandcastle.

0 голосов
/ 19 ноября 2008

Я сам этого не делал, но я видел это упомянутое в книгах прагматичных программистов Если я не ошибаюсь, в книге «Прагматическое модульное тестирование в C # с Nunit» упоминается, что они сделали это для книги. Вполне возможно, что они упоминали в одном из своих подкастов.

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

0 голосов
/ 19 ноября 2008

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

#include "samples/sampleA.h"

void main()
{
  SomeFunction();
}

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

Лучшее решение: Записать результаты и попросить кого-нибудь взглянуть на них утром.

Даже лучшее решение: Записать вывод и выполнить grep или что-то еще, чтобы никто не смотрел на него, если он не сломан.

Лучшее решение: Найдите подходящую тестовую среду, надеюсь, что-нибудь со всеми прибамбасами, которые вы можете получить, чтобы она могла отправлять электронные письма людям, если они сломаны или что-то в этом роде. В нашем случае мы избегаем наворотов, вместо этого мы подключили USB Police Siren , который гаснет, когда что-то ломается. Это довольно захватывающе!

...