Unit testing 在使用GNAT测试时,如何为函数添加第二个测试?
该测试演示如何生成线束和骨架单元测试。它为目标项目中的每个公共函数创建一个单元测试,但如果我添加了另一个单元测试,则在重新生成线束和骨架单元测试时会覆盖该单元测试 在gnattest提供的项目中,如何添加另一个测试?我试过: (1) 向已经存在的测试函数添加另一个断言行。这是可行的,但不是好的做法;第一个失败的测试会阻止其他测试运行 (2) 将函数定义添加到obj/gnattest/harness/gnattest.xml,然后不起作用;xml文件在用于创建测试存根之前会重新生成 (3) 通过以下更改将定义手动添加到测试/和线束/中,这些更改会因重新生成测试而受到影响 将其添加到obj/gnattest/tests/simple-test_data-tests.ads:Unit testing 在使用GNAT测试时,如何为函数添加第二个测试?,unit-testing,ada,gnat,aunit,Unit Testing,Ada,Gnat,Aunit,该测试演示如何生成线束和骨架单元测试。它为目标项目中的每个公共函数创建一个单元测试,但如果我添加了另一个单元测试,则在重新生成线束和骨架单元测试时会覆盖该单元测试 在gnattest提供的项目中,如何添加另一个测试?我试过: (1) 向已经存在的测试函数添加另一个断言行。这是可行的,但不是好的做法;第一个失败的测试会阻止其他测试运行 (2) 将函数定义添加到obj/gnattest/harness/gnattest.xml,然后不起作用;xml文件在用于创建测试存根之前会重新生成 (3) 通过以
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测试,一旦我了解如何正确使用它,就再也不回头了。我真的不知道为什么您希望为您编写单元测试框架;当您的测试框架设置正确时,不应该有样板代码。