首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用GNAT测试时,如何为函数添加第二个测试?

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

Stack Overflow用户
提问于 2018-09-13 17:04:18
回答 1查看 470关注 0票数 4

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

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

(1)将另一个断言行添加到已经存在的测试函数中。

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

将此内容添加到obj/gnattest/tests/simple-test_data-tests.ads:

代码语言:javascript
复制
   procedure Test_Inc2_4f8b9f (Gnattest_T : in out Test);

将此内容添加到obj/gnattest/tests/simple-test_data-tests.adb:

代码语言:javascript
复制
--  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函数

代码语言:javascript
复制
   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);

相反,运行以下命令

代码语言:javascript
复制
gprbuild -Pobj/gnattest/harness/test_driver.gpr
./obj/gnattest/harness/test_runner.exe`.

一定有更好的方法。

EN

回答 1

Stack Overflow用户

发布于 2018-12-18 16:15:35

如果您不介意修改测试对象(并在此过程中失去一点可移植性...),有一个特定于GNAT的编译指示或方面(Ada2012)

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

代码语言:javascript
复制
function Foo(Bar : in Integer) return Integer;
pragma Test_Case("Test 1", Robustness);

与aspect语法相同的示例:

代码语言:javascript
复制
function Foo(Bar : in Integer) return Integer
   with Test_Case => ("Test 1", Robustness);

代码语言:javascript
复制
function Foo(Bar : in Integer) return Integer
   with Test_Case => (Name => "Test 1", Mode => Robustness);

这将生成额外的包装器代码和测试用例,除非您指定Mode => Nominal (见下文)或两个可选参数RequiresEnsures中的任何一个,否则测试用例可能看起来很混乱

代码语言:javascript
复制
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-conditions,那么如果您指定Mode => Nominal,生成的代码也可以检查这些内容。

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52310259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档