2012-12-26 39 views
4

HTF有sample project,它显示了如何使用测试框架。模块MyPkg.A定义了一些测试,MyPkg.B定义了一些测试。是否有可能编写新的模块MyPkg.C,它聚合了模块A和B的测试(并且没有定义新的测试本身)?多个模块中的Haskell测试框架(HTF)和测试定义

我不想从A和B导入测试(在我的测试运行器主模块中),我想从单个C模块导入测试。

我实现MyPkg.C这样

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

import Test.Framework 
import {[email protected] HTF_TESTS @-} MyPkg.A 
import {[email protected] HTF_TESTS @-} MyPkg.B 

我的主测试模块是这样的:

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

import Test.Framework 
import Test.Framework.BlackBoxTest 
import {[email protected] 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' 

回答

3

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 

C.hs

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 {[email protected] HTF_TESTS @-} C 

main = htfMain htf_importedTests 

这工作,但问题是,我们在C.hs硬编码模块名称。我认为一个好主意是引入一个新的delegate_测试定义语句,允许您将测试委托给另一个TestableHTF,以便我们可以将htf_importedTests作为单个测试导出。也许您可以针对该问题或其他解决方案打开功能请求。

+2

目前,这是一个很好的解决方法。但我认为HTF应该简单地将所有已导入的测试添加到thisModulesTests。这就是你的代码手工完成的工作,这就是HTF应该在未来自动完成的工作。我已经打开了一个问题,请参阅https://github.com/skogsbaer/HTF/issues/15 – stefanwehr

+0

@stefanwehr:的确,重新导入导入的测试似乎是最优雅和直观的解决方案 –