2015-07-03 4 views
5

Для моего проекта я написал некоторые модульные тесты в качестве сценариев bash. Там действительно не было разумного способа написать тесты в Haskell.Как использовать cabal с испытаниями bash

Я хотел бы, чтобы эти сценарии запускались при вводе cabal test. Как это сделать?

ответ

1

Прежде всего, вам нужно добавить тестовый комплект в свой файл cabal. Для этого вы будете использовать exitcode-stdio набор тестов, который будет выглядеть примерно так:

Name:   foo 
Version:  1.0 
License:  BSD3 
Cabal-Version: >= 1.9.2 
Build-Type:  Simple 

Test-Suite test-foo 
    type:  exitcode-stdio-1.0 
    main-is: test-foo.hs 
    build-depends: base 

В приведенном выше примере тест-набор был взят из the Cabal documentation for test suites

Затем в файле test-foo.hs вы бы запустить скрипт Баш и die с исключением для ненулевого кода выхода. Вы можете сделать это с помощью System.Process:

-- test-foo.hs 
import System.Exit (ExitSuccess) 
import System.Process (system) 

main = do 
    -- This dies with a pattern match failure if the shell command fails 
    ExitSuccess <- system "./myprog" 
    return() 

Затем вы можете запустить выше тест с использованием cabal test и сообщит о провале теста если ваша программа-оболочка имеет код выхода ненулевого.

+0

Невозможно ли использовать только конфигурацию кабины? У меня около 20 скриптов, которые я бы хотел запустить, и я не хочу создавать пустые программы haskell для каждого из них. Мое текущее решение по использованию make-файла было бы проще. –

+0

Вы можете запускать все из них в рамках одной программы Haskell. Вам не нужно создавать отдельную программу Haskell для каждого скрипта. –

+0

Верно, но тогда, когда я запускаю 'cabal test', если какой-либо тест не удается, он не скажет мне, какой из них был неудачным. Это просто скажет мне, что один из сценариев bash не удался. –

3

Этот модуль позволит вам запускать все сценарии .sh в определенном подкаталоге в качестве теста. Кроме того, это использует test-framework пакет, так что если вы хотите, вы можете запустить тест, как:

cabal test '--test-option=--jxml=dist/test/$test-suite.xml' 

И тогда вы можете получить JUnit стиль XML из тестов. В настоящее время он зарегистрирован в my project for testing cabal things. Тестовый код:

import Data.List (isSuffixOf) 
import Control.Applicative 
import Test.Framework (defaultMain, testGroup, Test) 
import Test.Framework.Providers.HUnit 
import Test.HUnit (assertFailure) 
import System.Directory 
import System.Exit (ExitCode(..)) 
import System.Process 


main :: IO() 
main = makeTests "test" >>= defaultMain 

-- Make a test out of those things which end in ".sh" and are executable 
-- Make a testgroup out of directories 
makeTests :: FilePath -> IO [Test] 
makeTests dir = do 
    origDir <- getCurrentDirectory 
    contents <- getDirectoryContents dir 
    setCurrentDirectory dir 
    retval <- mapM fileFunc contents 
    setCurrentDirectory origDir 
    return $ concat retval 
    where 
    fileFunc "." = return [] 
    fileFunc ".." = return [] 
    fileFunc f | ".sh" `isSuffixOf` f = do 
     fullName <- canonicalizePath f 
     isExecutable <- executable <$> getPermissions fullName 
     let hunitTest = mkTest fullName 
     return [testCase f hunitTest | isExecutable] 
    fileFunc d = do 
     fullName <- canonicalizePath d 
     isSearchable <- searchable <$> getPermissions fullName 
     if isSearchable 
     then do subTests <- makeTests d 
       return [testGroup d subTests] 
     else return [] 
    mkTest fullName = do 
     execResult <- system fullName 
     case execResult of 
     ExitSuccess -> return() 
     ExitFailure code -> assertFailure ("Failed with code " ++ show code) 

Я использую это с этим пунктом в моем .cabal файле:

test-suite BackflipShellTests 
    type:    exitcode-stdio-1.0 
    main-is:    BackflipShellTests.hs 
    hs-source-dirs:  test 
    build-depends:  backflip, base, test-framework-hunit, 
         test-framework, directory, process, HUnit 
    default-language: Haskell2010 

Обратите внимание, что, хотя я поместил .sh тесты и тест-модуль в том же каталоге (так называемый test), для этого нет неотъемлемой причины.

 Смежные вопросы

  • Нет связанных вопросов^_^