SRFI-64를 사용하는 코드 카타
매일 아침 코드카타를 30분 정도 하는 습관이 생겼습니다. 테스트 주도 개발(TDD) 접근 방식에 따라 이러한 Kata를 연습합니다.
Guile 배포에는 단위 테스트 프레임워크인 SRFI-64 모듈이 포함됩니다. 이 기사에서는 코드 카타를 연습하기 위해 사용 방법과 구성 방법을 설명합니다.
기본 사용법
SRFI-64 모듈에는 기본 구성이 있습니다. 여기서 어떤 모습인지 보여드리겠습니다.
다음은 단 하나의 테스트(실패할 운명)로 테스트 스위트를 생성하는 Guile 프로그램입니다.
(use-modules (srfi srfi-64))
(test-begin "demo")
(test "Hookup" #f #t)
(test-end "demo")
프로그램 설명 :
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-value
및 expected-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!
Reference
이 문제에 관하여(SRFI-64를 사용하는 코드 카타), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jeremykorwin/code-kata-with-srfi-64-285p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)