elm-test의 테스트 코드 개선에 도전해 보겠습니다.

보이는



모듈을 만들면 애플리케이션에서 실행하는 것은 억지이므로 자산 남은 뒤에 테스트 코드를 실행하고 있습니다만,
elm-test 의 테스트 코드의 가독성을 좀 더 올릴 수 없을까, 조금 궁리해 보았습니다.
개선은 절대적으로 좋아진 것처럼 보이지만, 어디까지나 개인적인 취향입니다.

아래가 elm-test init 그러면 자동적으로 들어오는 샘플 코드의 발췌로, 이것을 초기 상태로 합니다.
이 중에는 2개의 테스트 케이스가 들어 있고,
둘 다 공 기대 값과 함수 결과의 두 값의 동일성을보고 있습니다.

Tests.elm (원래 코드)
all : Test
all =
    describe "Unit test examples"
        [ test "Addition" <|
            \() ->
                Expect.equal (3 + 7) 10
        , test "String.left" <|
            \() ->
                Expect.equal "a" (String.left 1 "abcdefg")
        ]

자신에게 있어서는 아래와 같은 요소 근처가 약간 작법적이고, 가독성을 낮추거나 매회 기술해야 하는 번거로움을 느끼게 할까라고 생각합니다.
  • 괄호 생략 <|
  • \() ->의 함수 설명

  • 변경 1: 큰 틀 변경



    단계적으로 변경해 나가려고 합니다.
    우선, test 함수의 형태 주석이 다음과 같이 되어 있습니다.
    test : String -> (() -> Expectation) -> Test
    

    문자열과 함수의 두 값을 받고 Test 유형을 반환하기 때문에,
    test 함수의 앨리어스(alias)가 되는 중치 함수를 정의해 주면(자) <| (을)를 생략 할 수 있을 것 같습니다."テスト内容" => コード 라는 느낌이 되도록 해 봅니다.

    TestExp.elm
    module TestExp exposing (..)
    
    import Test exposing (Test)
    import Expect exposing (Expectation)
    
    (=>) : String -> (() -> Expectation) -> Test
    (=>) = Test.test
    

    =>関数를 테스트 코드에 적용해보십시오.

    Tests.elm(v1)
    import TestExp exposing (..)
    
    all : Test
    all =
        describe "Unit test examples"
            [ "Addition" =>
                \() ->
                    Expect.equal (3 + 7) 10
            , "String.left" =>
                \() ->
                    Expect.equal "a" (String.left 1 "abcdefg")
            ]
    
    test関数<| 가 없어져, 조금 깨끗이 한 것처럼 느낍니다.

    변경 2 : 빈 인수를 취하는 함수 변경



    다음에 \() -> 를 어떻게든 할 수 없을까-와. 1행 전유하고 있고. .
    다시 한번, test 함수의 형태 주석을 보면, 2 번째의 인수는 ()
    test : String -> (() -> Expectation) -> Test
    
    () 를 인수에 취해, 호출할 때에는 생략하는 함수의 정의 패턴은 다음과 같은 것이 생각됩니다.
    f : () -> Int
    f _ = 100
    
    f : () -> Int
    f = \() -> 10
    

    그럼, Expect.equal 함수에 \() -> 기술을 흡수해 줄까라고 생각합니다.
    그래서 eq 함수를 만들어 보았습니다.

    TestExp.elm (추기)
    eq : a -> a -> () -> Expectation
    eq a b _ = Expect.equal a b
    

    eq関数를 테스트 코드에 적용해보십시오.

    Tests.elm(v2)
    all : Test
    all =
        describe "Unit test examples"
            [ "Addition"
                => eq (3 + 7) 10
            , "String.left"
                => eq "a" (String.left 1 "abcdefg")
            ]
    

    당초의 과제가 모두 클리어되었습니다.
    이것으로 개인적으로 느끼고 있던 작법감이 없어졌습니다!

    변경 3: 가독성 더 올라가거나 도전



    v2의 코드로 부족감은 없습니다만,
    동일성을 조사한다는 것을 좀 더 이해하기 쉽지 않을까?
    마지막으로 eq関数를 중간 함수로 변경하고 싶습니다.=> 의 우변에 괄호를 붙일 필요가 없도록 연산 우선도도 조정합니다.

    TestExp.elm (변경)
    (===) : a -> a -> () -> Expectation
    (===) a b _ = Expect.equal a b
    
    infixl 8 =>
    

    이것을 테스트 코드에 적용해 보겠습니다.

    Tests.elm(v3)
    all : Test
    all =
        describe "Unit test examples"
            [ "Addition"
                => (3 + 7) === 10
            , "String.left"
                => "a" === (String.left 1 "abcdefg")
            ]
    

    동일성을 확인하고 있다는 것을 좀 더 말하고 있는 코드가 된 것은 아닐까 생각합니다.
    v2와 v3는 어느 쪽이 좋은가는 취향의 문제일까라고.

    중치 함수 만드는 수법은 JS에서는 할 수 없었던 방식이므로 Elm 귀엽다고 하는 생각이 한층 더 늘어나는 포인트일까라고 생각합니다.
    남용하면 오레올레 기호 투성이의 코드가 된다고 생각하므로, 요소만의 사용이 좋지 않을까.
    자신은 굳이 회사의 멤버에게 이번 테스트 코드의 수법을 공유해, 멤버에게 훙훅해 준 v3를 채용했습니다.

    좋은 웹페이지 즐겨찾기