Этот модуль позволит вам запускать все сценарии .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
), для этого нет неотъемлемой причины.
Невозможно ли использовать только конфигурацию кабины? У меня около 20 скриптов, которые я бы хотел запустить, и я не хочу создавать пустые программы haskell для каждого из них. Мое текущее решение по использованию make-файла было бы проще. –
Вы можете запускать все из них в рамках одной программы Haskell. Вам не нужно создавать отдельную программу Haskell для каждого скрипта. –
Верно, но тогда, когда я запускаю 'cabal test', если какой-либо тест не удается, он не скажет мне, какой из них был неудачным. Это просто скажет мне, что один из сценариев bash не удался. –