SRFI-64를 사용하는 코드 카타

14372 단어 katatddschemeguile


매일 아침 코드카타를 30분 정도 하는 습관이 생겼습니다. 테스트 주도 개발(TDD) 접근 방식에 따라 이러한 Kata를 연습합니다.

Guile 배포에는 단위 테스트 프레임워크인 SRFI-64 모듈이 포함됩니다. 이 기사에서는 코드 카타를 연습하기 위해 사용 방법과 구성 방법을 설명합니다.

기본 사용법



SRFI-64 모듈에는 기본 구성이 있습니다. 여기서 어떤 모습인지 보여드리겠습니다.

다음은 단 하나의 테스트(실패할 운명)로 테스트 스위트를 생성하는 Guile 프로그램입니다.

(use-modules (srfi srfi-64))
(test-begin "demo")
(test "Hookup" #f #t)
(test-end "demo")

프로그램 설명 :
  • 1행: (srfi srfi-64)라는 모듈을 로드합니다.
  • 2행 : 테스트 그룹 데모의 시작을 나타냅니다.
  • 3행: test-equal 프로시저를 사용하여 "Hookup"이라는 이름의 테스트를 정의합니다. 첫 번째 매개변수는 테스트에서 예상되는 결과(여기서는 #t )이고 두 번째 매개변수는 테스트된 표현식(여기서는 #t ).
  • 4행: demo 테스트 그룹의 끝을 나타냅니다.

  • 비교적 간단하고 프릴이 거의 없습니다.

    /tmp/tests.scm 파일에 저장하고 다음을 실행하면 이 스위트의 실행 결과입니다.

    $ guile --no-auto-compile test.scm 
    %%%% Starting test demo (Writing full log to "demo.log")
    /tmp/test.scm:3: FAIL Hookup
    # of unexpected failures 1
    

    콘솔에는 결과 요약만 표시됩니다. 3행은 "연결"테스트의 예기치 않은 실패를 보여줍니다. 매우 간단하지만 프로그램 상태에 대한 빠른 아이디어를 제공합니다.

    전체 세부 정보는/tmp/demo.log 파일에 있습니다.

    cat demo.log
    %%%% Starting test demo
    Group begin: demo
    Test begin:
      test-name: "Hookup"
      source-file: "/tmp/test.scm".
      source-line: 3
      source-form: (test-equal "Hookup" #f #t)
    Test end:
      result-kind: fail
      actual-value: #t
      expected-value: #f
    Group end: demo
    # of unexpected failures 1
    

    이 보고서는 내가 많이 사용하는 두 가지 정보인 actual-valueexpected-value를 제공합니다.

    이 기본 구성은 바로 사용할 수 있지만 콘솔(테스트 및 상태 목록)과 파일(테스트 결과)의 두 위치에 정보를 제공하는 단점이 있습니다. 실용성이 별로...

    다행히 테스트 프레임워크는 쉽게 구성할 수 있습니다. 다음 기사에서는 코드 카타 전용 구성을 소개합니다.

    Code Kata 구성

    여기서 아이디어는 필요한 모든 정보를 콘솔에 직접 표시하도록 SRFI-64 모듈을 구성하는 것입니다(그리고 파일로 보고할 필요가 없음). 한눈에 보고싶다 :
  • 실행된 테스트 목록 ;
  • 이러한 각 테스트의 상태;
  • 실패한 테스트의 경우 예상 값과 얻은 값을 표시합니다.

  • SRFI-64 참조에 따르면 테스트 스위트에 대한 통계(총 테스트 수, 성공, 실패, 통과 등)를 유지 관리하는 개체는 테스트 실행기입니다.

    새 테스트 러너 작성 섹션과 웹에서 수집한 몇 가지 예제 덕분에 자신에게 적합한 테스트 러너를 만들 수 있습니다!

    다음은 내가 직접 만든 것입니다(Mathieu Lirzin과 Alex Sassmannshausen의 작업을 기반으로 함).

    ;;;; kata-driver.scm - Guile test driver for code kata practice
    
    (define script-version "2020-10-04") ;UTC
    
    ;;; Copyright © 2015, 2016 Mathieu Lirzin <[email protected]>
    ;;; Copyright © 2019 Alex Sassmannshausen <[email protected]>
    ;;; Copyright © 2019 Jérémy Korwin-Zmijowski <[email protected]>
    ;;;
    ;;; This program is free software; you can redistribute it and/or modify it
    ;;; under the terms of the GNU General Public License as published by
    ;;; the Free Software Foundation; either version 3 of the License, or (at
    ;;; your option) any later version.
    ;;;
    ;;; This program is distributed in the hope that it will be useful, but
    ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
    ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ;;; GNU General Public License for more details.
    ;;;
    ;;; You should have received a copy of the GNU General Public License
    ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    ;;;; Commentary:
    ;;;
    ;;; This script provides a Guile test driver using the SRFI-64 Scheme API for
    ;;; test suites.  SRFI-64 is distributed with Guile since version 2.0.9.
    ;;;
    ;;; This script is a very cleaned up version of the Alex Sassmannshausen 's 
    ;;; version. The changes make it suitable for use in a code kata practice.
    ;;;
    ;;;; Code:
    
    (define-module (runner-kata)
      #:export (test-runner-kata))
    
    (use-modules (srfi srfi-64)
                 (ice-9 pretty-print)
                 (srfi srfi-26))
    
    (define* (test-display field value  #:optional (port (current-output-port))
                           #:key pretty?)
      "Display 'FIELD: VALUE\n' on PORT."
      (if pretty?
          (begin
            (format port "~A:~%" field)
            (pretty-print value port #:per-line-prefix "+ "))
          (format port "~A: ~S~%" field value)))
    
    (define* (result->string symbol)
      "Return SYMBOL as an upper case string.  Use colors when COLORIZE is #t."
      (let ((result (string-upcase (symbol->string symbol))))
        (string-append (case symbol
                         ((pass)       "")  ;green
                         ((xfail)      "")  ;light green
                         ((skip)       "")  ;blue
                         ((fail xpass) "")  ;red
                         ((error)      "")) ;magenta
                       result
                       "")))
    
    (define* (test-runner-kata)
    
      (define (test-on-test-end-kata runner)
        (let* ((results (test-result-alist runner))
               (result? (cut assq <> results))
               (result  (cut assq-ref results <>)))
          (if (equal? 'fail (result 'result-kind))
          (begin
            (newline)
            (format #t "~a ~A~%"
                (result->string (result 'result-kind))
                (result 'test-name))
            (when (result? 'expected-value)
                  (test-display "expected-value" (result 'expected-value)))
            (when (result? 'expected-error)
                  (test-display "expected-error" (result 'expected-error) #:pretty? #t))
            (when (result? 'actual-value)
                  (test-display "actual-value" (result 'actual-value)))
            (newline))
          (begin
            (format #t "~a ~A~%"
                (result->string (result 'result-kind))
                (result 'test-name))))))
    
      (let ((runner (test-runner-null)))
        (test-runner-on-test-end! runner test-on-test-end-kata)
        runner))
    

    코드 kata용 프로젝트 템플릿이 포함된 git 저장소를 만들었습니다. README 지침과 코드를 따르십시오!

    다음은 watch.sh 스크립트가 실행되는 동안 터미널의 피드백 예입니다.

    FAIL Hookup
    expected-value: #f
    actual-value: #t
    

    문제가 무엇인지 찾기 위해 더 이상 보고서의 내용(더 이상 생성되지 않음)을 볼 필요가 없습니다. 따라서 저장할 때마다 전용 emacs 버퍼에서 이 스크립트를 실행하고 테스트 결과에 따라 조치를 취할 수 있습니다.

    이제 당신에게 달렸습니다!

    코드 카타 연습을 선택하고 약 30분 동안 작업한 다음 아래 댓글에 코드 및 테스트에 대한 링크를 공유하십시오!

    그런 다음 다음 세션을 위해 2센트를 드립니다!

    Thank you so much for reading this article!

    Don't hesitate to give me your opinion or ask a question !
    To do so, please leave a comment below or contact me.

    And most importantly, share the blog and tell your friends it's the best blog in the history of Free Software! No shit!

    좋은 웹페이지 즐겨찾기