Как добавить второй тест для функции при использовании теста GNAT? - PullRequest
0 голосов
/ 13 сентября 2018

Документация для теста Gnat показывает, как генерировать модульные тесты жгута и каркаса. Он создает один модульный тест для каждой общедоступной функции в целевом проекте, но если я добавлю другую, он будет перезаписан при повторном создании модульных тестов жгута и каркаса.

В простом примере проекта , поставляемом с gnattest, как мне добавить еще один тест? Я пробовал:

(1) Добавление еще одной строки Assert к тестовой функции, которая уже существует. Это работает, но не является хорошей практикой; первый провал теста не позволяет запустить другие.

(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 и создайте и добавьте_тест в функцию Suite в файле obj / gnattest / harness / simple-test_data-tests-suite.adb:

   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`.

Должен быть лучший путь.

1 Ответ

0 голосов
/ 18 декабря 2018

Существует специфическая для GNAT прагма или аспект (Ada 2012), если вы не возражаете против изменения объекта тестирования (и потери части переносимости в процессе ...)

Я покажусначала синтаксис для прагмы, остальные примеры будут использовать аспектный синтаксис:

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 (см. Ниже) или любой из двух необязательных параметров, Requires и Ensures:

function Foo(Bar : in Integer) return Integer
   with Test_Case => (Name => "Test 1", 
                      Mode => Robustness,
                      Requires => Bar < 10,
                      Ensures => Foo'Result > 15);

Requires действует как предварительное условие для конкретного тестового случая, а Ensures действует как пост-условие для конкретного тестового случая, которое будет проверяться сгенерированным кодом оболочки.Если у вас есть условия Pre или Post для объекта тестирования, сгенерированный код также может проверить их, если вы укажете 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);
...