Вы могли бы сделать это, но это действительно неправильный подход. Вы заново изобретаете велосипед и настраиваете себя на то, что пропускаете тесты, потому что не можете постоянно и надежно повторять тесты.
Тестирование должно быть повторяемым и всегда должно использовать как можно больше возможных вариантов тестирования, которые можно протестировать каждый раз, когда что-то меняется, чтобы убедиться, что вы не вносите ошибку (или не возвращаете ошибку, которую вы исправили ранее), и чтобы позволяют легко поддерживать новые опции, параметры или значения.
Вы должны использовать DUnit
(модульное тестирование Delphi), включенное в Delphi для нескольких версий. (и доступен для более ранних версий на SourceForge), который позволяет автоматизировать процесс тестирования и включает TreeView
, который показывает настройки тестов (называемые Suites
), отдельные тесты, составляющие этот набор, и результаты каждого теста. Он позволяет тестировать то, что должно работать, и то, что не должно (и убедиться, что оно не работает), и постоянно повторять тесты, чтобы ничего не пропустить. Он также предоставляет информацию обо всех неудачных тестах, а также информацию, которая поможет найти (и устранить) причину сбоя.
В версиях Delphi, которые уже включают DUnit
(что, как я полагаю, начинается с Delphi 2007 и более поздних версий), используйте File->New->Other->Unit Tests->Test Project
для создания оболочки. Для тестирования, не основанного на классах, создайте еще один новый модуль и настройте тесты вручную. Вот вам оболочка для начала, с тестами для двух бессмысленных функций:
unit MyFunctionsTests;
{
Delphi DUnit Test Case Skeleton Unit
}
interface
uses
TestFramework, MyFunctions;
type
// Test methods for MyFunctions unit
// In the real world, you'd create separate test cases,
// one for tests that should pass and one for tests that
// should fail, and run them separately or in succession.
// This is just a simple shell.
TTestMyFunctions = class(TTestCase)
strict private
public
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestFunctionOne;
procedure TestFunctionTwo;
end;
implementation
procedure TTestMyFunctions.Setup;
begin
// Do any necessary initializations, set variables, etc.
end;
procedure TTestMyFunctions.TearDown;
begin
// Free any objects, release any memory, etc. here
end;
procedure TTestMyFunctions.TestFunctionOne;
begin
// FunctionOne takes two integers and adds them, and
// returns the sum
CheckTrue(FunctionOne(1, 1) = 2); // Test success
CheckFalse(FunctionOne(2, 2) = 5); // Test failure
end;
procedure TTestMyFunctions.TestFunctionTwo;
begin
CheckEqualsString('AB', FunctionTwo('A', 'B')); // Success
CheckFalse(FunctionTwo('B', 'A') = 'AB'); // Failure
end;
initialization
// Register any test cases with the test runner
RegisterTest(TTestMyFunctions.Suite);
end.
Используйте Project->Add to Project
и добавьте свой модуль (MyFunctions.pas
) и новый модуль тестового примера (MyFunctionTests.pas
в приведенной выше оболочке). Это должно выглядеть примерно так:
program MyFunctionUnitTests;
{
Delphi DUnit Test Project
-------------------------
This project contains the DUnit test framework and the GUI/Console test runners.
Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options
to use the console test runner. Otherwise the GUI test runner will be used by
default.
}
{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
DUnitTestRunner,
MyFunctions in '..\MyFunctions.pas',
MyFunctionsTests in 'MyFunctionsTests.pas';
{$R *.RES}
begin
DUnitTestRunner.RunRegisteredTests;
end.
Теперь запустите проект и в появившемся окне нажмите зеленую кнопку Play
(аналогично кнопке запуска в Delphi IDE) или нажмите F9. Древовидное представление покажет вам результаты тестов (зеленый — пройденный, красный — не пройденный). Если тест не пройден, вы можете просмотреть информацию об ошибке для этого теста в нижней части окна. (Если вы не можете, используйте окно View
для отображения ошибок.)
30.05.2013