我可以翻译为:我能否在DUnitx中向测试用例传递类型参数?

3

我正在为我的FastCode项目编写测试用例。

我已经编写了一个通用的测试器,例如:

  TTest<T> = record
  private
    class var Def: System.Generics.Defaults.IComparer<T>;
    class var F: FastDefaults.TComparison<T>;
  strict private
    class function Slow(const Left, Right: T): integer; static;
    class function Fast(const Left, Right: T): integer; static;
    class constructor Init;
  public
    class procedure Test(const Left, Right: T); static;
  end;

一个典型的测试用例如下所示:
[Test]
[TestCase('Single', '100.0,100.0')]
...many more testcases...
procedure TestSingle(const L,R: Single);
[Test]
[TestCase('Double', '100.0,100.0')]
...many more testcases... (identical to the one above).
procedure TestDouble(const L,R: double);

测试代码通常如下所示(每个类型都要重复):
procedure TestDefault.TestSingle(const L, R: Single);
begin
  TTest<Single>.Test(L,R);
end;

我希望你能帮我做什么:

[Test]
[TestTypes('single,double,extended')]
[TestCase('description', '100.0,100.0')]
...many more test cases....
procedure Test<TC>(L,R: TC);

让测试运行所述的类型,这样我就不必写太多样板文件。
DUnitX可以实现这样的功能吗?


属性在这里看起来不太适合。你不想把测试输入/输出放在外部文件中吗?泛型也不太适合。当你将它们与数字类型一起使用时,没有可用的运算符。这是泛型的一个悲哀缺陷。哦,要是有模板就好了。 - David Heffernan
1个回答

4
尝试使您的测试类通用,并将测试类注册到您想要测试的每个具体类型中。
  [TestFixture]
  TMyTestObject<T> = class(TObject)
  public
    // Sample Methods
    // Simple single Test
    [Test]
    procedure Test1;
    // Test with TestCase Atribute to supply parameters.
    [Test]
    [TestCase('TestA','1,2')]
    [TestCase('TestB','3,4')]
    procedure Test2(const AValue1 : T; const AValue2 : T);
  end;

  //...

  initialization
    TDUnitX.RegisterTestFixture(TMyTestObject<integer>);
    TDUnitX.RegisterTestFixture(TMyTestObject<double>);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接