DUnit: Как запускать тесты?

Как запустить TestCase из IDE?

я создал новый проект с одной простой формой:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

end.

Теперь я добавлю тестовый пример, чтобы проверить, что нажатие Button1 делает то, что должно:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
    TestFramework;

type
  TForm1Tests = class(TTestCase)
  private
        f: TForm1;
  protected
     procedure SetUp; override;
     procedure TearDown; override;
  published
     procedure TestButton1Click;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    //todo
end;

{ TForm1Tests }

procedure TForm1Tests.SetUp;
begin
  inherited;

    f := TForm1.Create(nil);
end;

procedure TForm1Tests.TearDown;
begin
    f.Free;
  inherited;
end;

procedure TForm1Tests.TestButton1Click;
begin
    f.Button1Click(nil);
    Self.CheckEqualsString('Hello, world!', f.Caption);
end;

end.

Учитывая то, что я сделал (тестовый код в проекте с графическим интерфейсом), как мне теперь запустить запуск тестов? Если я нажму F9, то просто появится форма:

альтернативный текст

В идеале в IDE должна быть кнопка или пункт меню с надписью Запустить тесты DUnit:

альтернативный текст

Я живу в мире грез? Страна фантазий, жизнь в домике с леденцами на леденцовой дорожке?


person Ian Boyd    schedule 22.03.2010    source источник
comment
Кроме того, вы обнаружите, что вашу бизнес-логику легче тестировать, если вы разделите ее на классы, вместо того, чтобы пытаться напрямую тестировать обработчики событий пользовательского интерфейса.   -  person Incredulous Monk    schedule 23.03.2010
comment
@Monk: Недостатком этого является то, что у меня есть код, распределенный по нескольким классам или, что еще хуже, по нескольким файлам.   -  person Ian Boyd    schedule 25.03.2010


Ответы (3)


Я согласен с Уве Раабе, но иногда может быть полезно иметь «скрытую» ссылку в вашем приложении для запуска графического интерфейса DUnit. Я использую:

TGUITestRunner.runRegisteredTests;

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


Например, если вы удерживаете специальную комбинацию клавиш при открытии собственной "панели управления" программного обеспечения, вы получаете некоторые расширенные записи:

введите здесь описание изображения

person Brian Frost    schedule 22.03.2010
comment
ПОЧЕМУ это лучше, чем группа проектов с MyApp и MyApp_Tests в виде двух отдельных проектов? - person Warren P; 22.03.2010
comment
Если бы у меня был отдельный проект с тестовым кодом, то не было бы отдельного проекта? Я действительно не хочу переключаться между проектами. я не хочу переключаться между реальным проектом и тестовым проектом. Если это означает, что у меня есть тестовый код, встроенный в мой окончательный исполняемый файл: пусть будет так. - person Ian Boyd; 22.03.2010
comment
Переключаемый «реальный» и «тестовый» проект? Код пахнет впереди :P - person mjn; 22.03.2010
comment
@Ian Boyd: Кажется, есть способ сделать это по задумке или по дорожке леденцов. - person Uwe Raabe; 23.03.2010
comment
@Uwe Меня больше интересует простота использования, а не то, как его используют другие. - person Ian Boyd; 23.03.2010
comment
@mjustin Ваша идея звучит интересно - один проект. Как бы это сделать? - person Ian Boyd; 23.03.2010
comment
@Warren P: Поскольку бывают (неприятные) ситуации, когда ваше приложение находится на компьютере клиента, он (она) не заглядывает вам через плечо, и вы благословляете, что можете использовать некоторые низкоуровневые встроенные инструменты, такие как ваши тесты DUnit, чтобы заверить вас, что основы в порядке. Бри - person Brian Frost; 23.03.2010
comment
@Brian Frost: никто не мешает вам скопировать TextProject.exe на эту машину и запустить его. - person Uwe Raabe; 23.03.2010
comment
@Ian Boyd: Я сделал что-то вроде переключаемого проекта для автоматизации скриншотов. Для этого я использую специальную конфигурацию сборки. Это похоже на отладочную сборку, клиент никогда не увидит (не должен) ее. - person Uwe Raabe; 23.03.2010
comment
+1 за возможность запускать тесты из производственной среды. @Uwe вам может быть разрешено или вы можете скопировать свой тестовый исполняемый файл в производственную среду. - person Frank Shearar; 23.03.2010
comment
+1 за идею тоже! Во многих случаях раздражает или проблематично заставить клиента получить другой EXE-файл и запустить его. - person stg; 23.03.2010
comment
@Brian: Вашему клиенту повезло, что на него работает разработчик, который понимает ценность модульного тестирования. Разве не иронично, что когда у них есть один из хороших (т.е. вы), вы получаете отговорку? :-) - person Warren P; 23.03.2010
comment
@Uwe Raabe Никто не мешает вам скопировать TextProject.exe на эту машину и запустить его. у меня есть два правительственных учреждения, которые мешают мне копировать TestProject.exe. Чем больше я могу втиснуть в один исполняемый файл. я уже внедрил IXMLHttpRequest тестовое приложение (если на пути есть прокси-сервер) и анализатор запросов. Удаленное выполнение тестов через CoPilot — еще одна полезная вещь. - person Ian Boyd; 10.06.2011

Добавлять TestCase в основной проект не стоит. Вы должны создать отдельный TestProject (вы можете иметь его в той же ProjectGroup, что и основной проект), добавить TestCase и запустить.

person Uwe Raabe    schedule 22.03.2010
comment
Точно. Код тестового примера не принадлежит ВАШЕМУ ПРИЛОЖЕНИЮ. Ваш тестовый проект содержит ваши модульные тесты. Вы создаете новое модульное тестовое приложение, добавляете код своего приложения в раздел использования вашего модульного теста. - person Warren P; 22.03.2010
comment
Есть ли способ запустить тестовый проект, не отвлекаясь от реального проекта? я хотел бы обрабатывать тесты, подобные Syntax Check, Build Project или Build All. - person Ian Boyd; 22.03.2010
comment
добавьте его как еще один проект в ту же группу проектов. Затем вы можете сделать сборку отсюда и так далее... - person Francesca; 22.03.2010
comment
@François Есть ли способ запустить тесты, содержащиеся в другом тестовом проекте, пока я нахожусь в проекте, который разрабатываю? - person Ian Boyd; 23.03.2010
comment
Мне кажется, что люди обеспокоены тем, что тестовый код находится в исполняемом файле, а не логически отделен, и используется для тестирования кода. Я согласен с тем, что DUnit работает так, что тестовые примеры компилируются... - person Ian Boyd; 23.03.2010
comment
@ Ян. Да, вы можете запустить оба проекта в отладчике, если они оба были скомпилированы до запуска первого. - person Francesca; 23.03.2010
comment
И причина, по которой я не могу этого сделать, - заголовок stackoverflow.com/questions/2508703/ - person Ian Boyd; 25.03.2010

Мне нравится идея иметь команду 'Run DUnit tests' в IDE.

Это можно реализовать, проверив проект DUnit в той же папке с тем же именем, что и текущий проект:

  • Project1.dpr -> тестируемое программное обеспечение
  • Project1.Tests.dpr => тестовое приложение DUnit

В этом случае в среде IDE должна быть включена команда «Выполнить тесты DUnit».

  • После выполнения тестов должен отображаться список всех неудачных тестов, что позволяет перейти к исходной строке, где тест не прошел.

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

(DUnit можно настроить для обнаружения утечек памяти и неудачных тестов, когда они были обнаружены)

person mjn    schedule 22.03.2010
comment
Теперь кто-то просто должен это написать ;) - person Ian Boyd; 28.05.2010
comment
Может быть, один из моих сторонников :) >delphi.uservoice.com/forums/4432-general/suggestions/ - person mjn; 28.05.2010