(Persistent를 통해) 데이터베이스에 액세스하는 많은 기능을 테스트해야합니다. monadicIO
및 withSqlitePool
을 사용하여이 작업을 수행 할 수 있지만 비효율적 인 테스트가 발생합니다. 각 테스트 (속성이 아니라 테스트)는 DB 풀을 만들고 파괴합니다. 어떻게 이것을 막을 수 있습니까?QuickCheck를 사용하여 데이터베이스 관련 기능을 테스트하는 방법은 무엇입니까?
중요 : 효율성이나 우아함을 잊어 버리십시오. 나는 심지어 QuickCheck
과 Persistent
유형을 작성하지 못했습니다.
instance (Monad a) => MonadThrow (PropertyM a)
instance (MonadThrow a) => MonadCatch (PropertyM a)
type NwApp = SqlPersistT IO
prop_childCreation :: PropertyM NwApp Bool
prop_childCreation = do
uid <- pick $ UserKey <$> arbitrary
lid <- pick $ LogKey <$> arbitrary
gid <- pick $ Aria2Gid <$> arbitrary
let createDownload_ = createDownload gid lid uid []
(Entity pid _) <- run $ createDownload_ Nothing
dstatus <- pick arbitrary
parent <- run $ updateGet pid [DownloadStatus =. dstatus]
let test = do
(Entity cid child) <- run $ createDownload_ (Just pid)
case (parent ^. status, child ^. status) of
(DownloadComplete ChildrenComplete, DownloadComplete ChildrenNone) -> return True
(DownloadComplete ChildrenIncomplete, DownloadIncomplete) -> return True
_ -> return False
test `catches` [
Handler (\ (e :: SanityException) -> return True),
Handler (\ (e :: SomeException) -> return False)
]
-- How do I write this function?
runTests = monadicIO $ runSqlite ":memory:" $ do
-- whatever I do, this function fails to typecheck
것은 당신이 당신의 quickcheck 호텔 중 한 곳의 예를 들어 주실 수 있습니까? – ErikR
'monadicIO'를 호출하지 않고'withSqlitePool'을 사용하고 싶지 않으십니까? 예 :'tests = withSqlitePool $ \ pool -> do monadicIO (test1 pool); 모나드IO (test2 풀)'. –
우리는': memory :'에 SQLite 연결을 사용한다. (나는 메모리 내 SQLite 데이터베이스라고 생각한다.) 병목 현상을 일으키지 않을 정도로 충분히 잘 작동하는 것 같지만, 아마도 우리는 우리보다 더 많은 데이터를 움직이고있을 것입니다. 여러분이 할 수있는 느린 힘든 일은'PersistStore'의 인스턴스를 만들고 그것을 (예를 들어)'Data.Map'의 묶음으로 구현하는 것입니다. 그러나 그것은 절대적으로'Database.Persist.Sql'에서 어떤 것을 사용하지 못하게합니다.이 경우'SqlBackend' 값을 생성하기 위해 팔과 다리를 사용해야합니다. – hao