Unit testing 在使用GNAT测试时,如何为函数添加第二个测试?

Unit testing 在使用GNAT测试时,如何为函数添加第二个测试?,unit-testing,ada,gnat,aunit,Unit Testing,Ada,Gnat,Aunit,该测试演示如何生成线束和骨架单元测试。它为目标项目中的每个公共函数创建一个单元测试,但如果我添加了另一个单元测试,则在重新生成线束和骨架单元测试时会覆盖该单元测试 在gnattest提供的项目中,如何添加另一个测试?我试过: (1) 向已经存在的测试函数添加另一个断言行。这是可行的,但不是好的做法;第一个失败的测试会阻止其他测试运行 (2) 将函数定义添加到obj/gnattest/harness/gnattest.xml,然后不起作用;xml文件在用于创建测试存根之前会重新生成 (3) 通过以

该测试演示如何生成线束和骨架单元测试。它为目标项目中的每个公共函数创建一个单元测试,但如果我添加了另一个单元测试,则在重新生成线束和骨架单元测试时会覆盖该单元测试

在gnattest提供的项目中,如何添加另一个测试?我试过:

(1) 向已经存在的测试函数添加另一个断言行。这是可行的,但不是好的做法;第一个失败的测试会阻止其他测试运行

(2) 将函数定义添加到obj/gnattest/harness/gnattest.xml,然后不起作用;xml文件在用于创建测试存根之前会重新生成

(3) 通过以下更改将定义手动添加到测试/和线束/中,这些更改会因重新生成测试而受到影响

将其添加到obj/gnattest/tests/simple-test_data-tests.ads:

   procedure Test_Inc2_4f8b9f (Gnattest_T : in out Test);
将其添加到obj/gnattest/tests/simple-test_data-tests.adb:

--  begin read only
   procedure Test_Inc2 (Gnattest_T : in out Test);
   procedure Test_Inc2_4f8b9f (Gnattest_T : in out Test) renames Test_Inc2;
--  id:2.2/4f8b9f38b0ce8c74/Inc/1/0/
   procedure Test_Inc2 (Gnattest_T : in out Test) is
   --  simple.ads:7:4:Inc
--  end read only
   begin
     Assert (Inc(2) = 2, "this test should fail");
--  begin read only
   end Test_Inc2;
--  end read only
将声明添加到第16行,并在obj/gnattest/harness/simple-test_data-tests-Suite.adb中将create和Add_测试添加到Suite函数中:

   Case_1_1_Test_Inc2_4f8b9f : aliased Runner_1.Test_Case;

  Runner_1.Create
    (Case_1_1_Test_Inc2_4f8b9f,
     "simple2.ads:7:4:",
     Test_Inc2_4f8b9f'Access);
  Result.Add_Test (Case_1_1_Test_Inc2_4f8b9f'Access);
要重新编译,请不要使用Makefile,因为这样会破坏更改。相反,跑吧

gprbuild -Pobj/gnattest/harness/test_driver.gpr
./obj/gnattest/harness/test_runner.exe`.

必须有更好的方法。

如果您不介意修改测试主题(并在过程中失去一点可移植性…),则有一个特定于蚊虫的术语或方面(Ada 2012)

我将首先展示pragma的语法,其余示例将使用方面语法:

function Foo(Bar : in Integer) return Integer;
pragma Test_Case("Test 1", Robustness);
function Foo(Bar : in Integer) return Integer
   with Test_Case => ("Test 1", Robustness);
与方面语法相同的示例:

function Foo(Bar : in Integer) return Integer;
pragma Test_Case("Test 1", Robustness);
function Foo(Bar : in Integer) return Integer
   with Test_Case => ("Test 1", Robustness);
或者,如果您喜欢命名协会:

function Foo(Bar : in Integer) return Integer
   with Test_Case => (Name => "Test 1", Mode => Robustness);
这将生成额外的包装器代码和测试用例,这可能看起来很混乱,除非您指定
模式=>Nominal
(见下文)或两个可选参数中的任何一个,
需要
确保

function Foo(Bar : in Integer) return Integer
   with Test_Case => (Name => "Test 1", 
                      Mode => Robustness,
                      Requires => Bar < 10,
                      Ensures => Foo'Result > 15);
当然,您可以添加多个
测试用例

function Foo(Bar : in Integer) return Integer
   with Test_Case => ("Test 1", Robustness),
        Test_Case => ("High Bar", Robustness),
        Test_Case => ("Low Bar", Robustness),
        Test_Case => ("Candy Bar", Robustness);

您是否可以展开
检查
谓词,而不是另一行
断言,例如
断言(关系或关系),…
?这比使用两个断言更糟糕,因为Assert消息甚至不能区分可能出错的两件事。我希望消息反映所选的逻辑运算符。第5.10.13条。附加测试提供了合适的替代方案?由于附加测试是手写的,因此无法自动重新生成线束和骨架单元测试,这正是我所寻找的。当我向生产代码中添加新函数时,我希望生成单元测试框架,保持原始测试代码不变;我只是停止使用gnat测试,一旦我了解如何正确使用它,就再也不回头了。我真的不知道为什么您希望为您编写单元测试框架;当您的测试框架设置正确时,不应该有样板代码。