gpt4 book ai didi

unit-testing - 使用 GNAT 测试时如何为函数添加第二个测试?

转载 作者:行者123 更新时间:2023-12-03 23:15:12 24 4
gpt4 key购买 nike

documentation for Gnat test 展示了如何生成一个线束和骨架单元测试。它为目标项目中的每个公共(public)函数创建一个单元测试,但是如果我添加另一个单元测试,当我重新生成线束和骨架单元测试时,它会被覆盖。

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

(1) 将另一个 Assert 行添加到已经存在的测试函数中。这行得通,但不是好的做法;第一个失败的测试会阻止其他测试运行。

(2) 在obj/gnattest/harness/gnattest.xml中添加函数定义然后regenerating the tests不工作; xml 文件在用于创建测试 stub 之前重新生成。

(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 行,并将 create 和 add_test 添加到 obj/gnattest/harness/simple-test_data-tests-suite.adb 中的 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`.

必须有更好的方法。

最佳答案

如果您不介意修改测试主题(并且在此过程中失去一点可移植性......),那么有一个 GNAT 特定的编译指示或方面(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
with Test_Case => (Name => "Test 1", Mode => Robustness);

这将生成额外的包装代码和一个测试用例,这可能看起来很困惑,除非你指定 Mode => Nominal (见下文)或两个可选参数中的任何一个, RequiresEnsures :
function Foo(Bar : in Integer) return Integer
with Test_Case => (Name => "Test 1",
Mode => Robustness,
Requires => Bar < 10,
Ensures => Foo'Result > 15);
Requires充当特定于测试用例的前提条件,
Ensures充当特定于测试用例的后置条件,
这将由生成的包装代码检查。
如果您有现有的 PrePost -测试对象的条件,生成的代码也可以检查这些,如果你指定 Mode => Nominal . (使用 Mode => Robustness 时它们将被忽略)。
function Foo(Bar : in Integer) return Integer
with Pre => Bar > 5,
Post => Foo'Result < 10,
Test_Case => (Name => "Test 1",
Mode => Nominal,
Requires => Bar < 10,
Ensures => Foo'Result > 15);

当然,您可以添加多个 Test_Case :
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);

关于unit-testing - 使用 GNAT 测试时如何为函数添加第二个测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52310259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com