LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

разбиваешь фунции на модули/файлы и пишешь тесты. На каждом языке будет выглядеть по своему.

Вот бредовый пример на Haskel:

module MyTest where
import Test.Hspec
import Test.QuickCheck

main = hspec $ do
  describe "myfunc" $ do
    -- проверяем ответ на конкретных входных данных
    it "should work for some examples" $ do
      myfunc "AWUBBWUBC" `shouldBe` "A B C"
      myfunc "AWUBWUBWUBBWUBWUBWUBC" `shouldBe` "A B C"
      myfunc "WUBAWUBBWUBCWUB" `shouldBe` "A B C"

      
    -- Или если мы знаем медленное решение, то проверяем что наше
    -- быстрое решение выдаёт теже ответы что и быстрое 
    -- на случайных данных
    it "should work for WUBranWUBWUBdomWUBWUB values" $ do
      property $ forAll (fmap concat $ listOf $ elements $ replicate 5 "WUB" ++ map return ['A'..'Z']) $ \xs ->
        myfunc xs `shouldBe` slow_solution xs
        
  where slow_solution :: String -> String
        slow_solution = unwords . words . go
          where go []               = []
                go ('W':'U':'B':xs) = ' ' : go xs
                go (x:xs)           =   x : go xs

Заодно быстрее понимаешь что функции тесно связаны друг с другом и у тебя корявый дизайн и нужно переделать, чтобы было легко тестировать…

вот небольшой список бесплатных статеек на некоторых языках: https://github.com/unicodeveloper/awesome-tdd

Исходная версия fsb4000, :

разбиваешь фунции на модули/файлы и пишешь тесты. На каждом языке будет выглядеть по своему.

Вот бредовый пример на Haskel:

module MyTest where
import Test.Hspec
import Test.QuickCheck

main = hspec $ do
  describe "myfunc" $ do
    -- проверяем ответ на конкретных входных данных
    it "should work for some examples" $ do
      myfunc "AWUBBWUBC" `shouldBe` "A B C"
      myfunc "AWUBWUBWUBBWUBWUBWUBC" `shouldBe` "A B C"
      myfunc "WUBAWUBBWUBCWUB" `shouldBe` "A B C"

      
    -- Или если мы знаем медленное решение, то проверяем что наше
    -- быстрое решение выдаёт теже ответы что и быстрое 
    -- на случайных данных
    it "should work for WUBranWUBWUBdomWUBWUB values" $ do
      property $ forAll (fmap concat $ listOf $ elements $ replicate 5 "WUB" ++ map return ['A'..'Z']) $ \xs ->
        myfunc xs `shouldBe` slow_solution xs
        
  where slow_solution :: String -> String
        slow_solution = unwords . words . go
          where go []               = []
                go ('W':'U':'B':xs) = ' ' : go xs
                go (x:xs)           =   x : go xs

Заодно быстрее понимаешь что функции тесно связаны друг с другом и у тебя корявый дизайн и нужно переделать, чтобы было легко тестировать…