2

我使用 Embarcadero XE2 在 delphi 中创建了一个库,我想测试它的功能和过程,但是它们太多了(超过 50 个)。我想创建一个表单来测试这些我的库,左侧有一个函数列表(带有类似选项的树视图),以及可选的文本框和表单右侧的触发按钮。我在网上找到了一些树视图教程,但他们用树视图可视化了数据库。

树视图不是必需的,任何可能的函数枚举都会很棒。

有什么简单的方法可以测试这么多功能吗?有没有更简单的方法来实现这个测试(表单)?

我的库作为 OpenOffice.org API 的折射器,它主要由程序组成,而不是函数,很难用单元测试框架进行测试,创建一个 GUI 来测试这个类会很棒,因为我必须检查手动他们如何工作。这种测试有什么解决方案吗?

4

2 回答 2

6

你可以这样做,但这确实是错误的方法。您正在重新发明轮子,并为自己错过测试内容做好准备,因为您无法始终如一且可靠地重复测试。

测试应该是可重复的,并且应该始终使用尽可能多的测试选项,每次发生变化时可以测试这些选项,以确保您不会引入错误(或放回之前修复的错误),并且允许您轻松支持新的选项或参数或值。

您应该使用DUnit (Delphi unit testing),它现在包含在 Delphi 中的几个版本中(并且可用于SourceForge的早期版本),它允许您自动化测试过程,并包括一个TreeView显示测试设置(称为Suites)、单个测试组成该套件,以及每个测试的结果。它允许您测试应该起作用的东西和不应该起作用的东西(并确保它们不起作用),并始终如一地重复测试,这样您就不会错过任何东西。它还为您提供有关任何失败的测试的信息,以及帮助您找到(并修复)失败条件的信息。

在已经包含的 Delphi 版本中DUnit(我相信这是从 Delphi 2007 及更高版本开始的任何内容),用于File->New->Other->Unit Tests->Test Project创建 shell。对于非基于类的测试,创建另一个新单元并手动设置测试。这是一个供您开始使用的 shell,其中包含对两个无意义函数的测试:

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在上面的 shell 中)。它应该看起来像这样:

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窗口显示错误。)

于 2013-05-30T14:36:57.613 回答
3

改用 Dunit。真的,你应该。这就是它的用途。 http://dunit.sourceforge.net/README.html

有一点学习曲线,但一旦你学会了,就会“啊啊啊啊!”

于 2013-05-30T14:26:35.123 回答