Haskell Test Framework (HTF) и определения тестов в нескольких модулях

У HTF есть пример проекта, в котором показано, как использовать тестовую среду. Модуль MyPkg.A определяет некоторые тесты, а MyPkg.B определяет некоторые тесты. Можно ли написать новый модуль MyPkg.C, который объединяет тесты из модулей A и B (и не определяет новые тесты сам по себе)?

Вместо того, чтобы импортировать тесты из A и B (в моем основном модуле запуска тестов), я хочу импортировать тесты из одного модуля C.

Я реализую MyPkg.C вот так

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module MyPkg.C (htf_importedTests) where

import Test.Framework
import {-@ HTF_TESTS @-} MyPkg.A
import {-@ HTF_TESTS @-} MyPkg.B

И мой основной модуль запуска тестов выглядит так:

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module Main where

import Test.Framework
import Test.Framework.BlackBoxTest
import {-@ HTF_TESTS @-} MyPkg.C

main = htfMain htf_importedTests

Когда я пытаюсь скомпилировать этот код, я получаю сообщение об ошибке:

TestMain.hs:23:5:
Not in scope: `htf_MyPkg_C_thisModulesTests'
Perhaps you meant `htf_Main_thisModulesTests'

person sergeyz    schedule 26.12.2012    source источник


Ответы (1)


Похоже, что HTF напрямую не поддерживает этот режим работы. Однако вы можете достичь цели с помощью некоторого хакерства:

A.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module A where
import Test.Framework

funA :: Int -> Int
funA x = x + 1

test_funA = assertEqual (funA 41) 42

B.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module B where
import Test.Framework

funB :: Int -> Int
funB x = x + 1

test_funB = assertEqual (funB 41) 42

К.ч.

module C where
import Test.Framework.TestManager

import A  
import B

htf_C_thisModulesTests =
   makeAnonTestSuite $ map testSuiteAsTest                  
     [ htf_A_thisModulesTests
     , htf_B_thisModulesTests
     ]

TestMain.hs:

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module TestMain where
import Test.Framework
import {-@ HTF_TESTS @-} C

main = htfMain htf_importedTests

Это работает, но проблема в том, что мы должны жестко закодировать имена модулей в C.hs. Я думаю, что хорошей идеей было бы ввести новый оператор определения теста delegate_, который позволяет вам делегировать тест другому TestableHTF, чтобы мы могли экспортировать htf_importedTests как один тест. Может быть, вы можете открыть запрос функции для этого или другого решения проблемы.

person Niklas B.    schedule 26.12.2012
comment
На данный момент это хороший обходной путь. Но я думаю, что HTF должен просто добавить все импортированные тесты в thisModulesTests. Это то, что ваш код делает вручную, и это то, что HTF должен делать автоматически в будущем. Я открыл задачу, см. github.com/skogsbaer/HTF/issues/15 - person stefanwehr; 27.12.2012
comment
@stefanwehr: Действительно, простой реэкспорт импортированных тестов кажется самым элегантным и интуитивно понятным решением. - person Niklas B.; 27.12.2012