여러 테스트 케이스를 동적으로 생성하려고합니다.
기본적으로 다른 값으로 동일한 테스트를 여러 번 실행하고 싶습니다. 더 나은 방법이있을 수 있습니다. 알려 주시면 아직 찾지 못했습니다.
인스턴스 make-test-suite
목록을 전달할 수 있다는 것을 발견 했습니다 test-case
.
그래서 for/fold
각 값 세트에 대해 생성 된 테스트 케이스를 플랫 목록으로 수집 하는 루프를 만들었습니다 .
내가 이해하지 못하는 것은 예외를 발생시키면서 모든 테스트를 성공적으로 실행하는 것 같습니다.
tests->test-suite-action received #<void> in list of tests (#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void>), which is not a test.
context...:
/usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:139:7
/usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:136:2
/usr/share/racket/pkgs/rackunit-lib/rackunit/private/test-suite.rkt:61:0: apply-test-suite
/usr/share/racket/pkgs/rackunit-lib/rackunit/text-ui.rkt:91:0: run-tests
"/write-thru-hash/tests.rkt": [running body]
temp35_0
for-loop
run-module-instance!
/usr/share/racket/pkgs/compiler-lib/compiler/commands/test.rkt:179:16
...
1 1 write-thru-hash/tests.rkt
8 tests passed
rkt-write-thru-hash_tests_1 exited with code 1
나는을 넣어 writeln
내 테스트 각각의 경우에서와 내가 함께 축약 인쇄 그 라인을 볼 수 ...
위. 그래서 테스트가 실제로 실행되고 있음을 알고 있습니다.
(테스트는 for/fold
루프를 곱하고 방금 본문에 빌드 하기 전에 실행되고 잘 작동했습니다. test-suite
)
내 tests.rkt
코드는 다음과 같습니다.
(define test-cases-list
(for/fold ([test-cases (list)])
([db-type (list 'sqlite 'postgres)])
(append test-cases
(list
(test-case/fixture "basic operations" ... )
(test-case/fixture "complex serializable keys and values" ... )
(test-case/fixture "custom table-name" ... )
(test-case/fixture "use initial src-hash" ... )))))
(define db-tests
(make-test-suite "db-tests" test-cases-list))
( https://docs.racket-lang.org/fixture/fixture
라이브러리를 사용하고 있습니다 )
최신 정보:
실제로 writeln
내 테스트 케이스에서 정의 시간에 인쇄되고 있다고 생각합니다 . 즉, test-suite
컨텍스트 외부에 있기 때문에 너무 일찍 실행되고 있습니다 .
나는 check
각 test-case
return 의 꼬리 를 추측한다. #<void>
그래서 나는 테스트 케이스 자체가 아닌 테스트 결과 (보이드)로 목록을 채우고 그것을 테스트 스위트에 제공했다.
하지만 실제로 사용하는 방법을 모르겠습니다 make-test-suite
...?
결국이를 수행하는 간단한 방법을 찾았습니다.
내 문제는 내 테스트 케이스의 여러 변형을 모두 동적으로 생성하려는 것 test-suite
입니다. 작동하도록하는 방법을 찾지 못했습니다. 매크로를 작성해야 할 것 같습니다.
대신 간단한 방법은 여러 test-suite
인스턴스 를 동적으로 정의한 다음 인스턴스 목록을 반복하여 실행하는 것입니다.
(define db-test-suites
(for/list ([db-type (list 'sqlite 'postgres)]
[db-conn-fixture (list sqlite-connection-delete-after-use
postgres-connection)])
(define suite-name (format "db-tests: ~a" db-type))
(test-suite suite-name
(test-case/fixture "basic operations"
#:fixture db-conn-fixture
(define db-conn (fixture-value db-conn-fixture))
...)
(test-case/fixture "complex serializable keys and values"
#:fixture db-conn-fixture
(define db-conn (fixture-value db-conn-fixture))
...))))
(for ([current-test-suite db-test-suites])
(run-tests current-test-suite))
최신 정보:
실제로 사용하는 방법도 찾았습니다 make-test-suite
.
(define all-tests (make-test-suite "db-test-suites" db-test-suites))
(run-tests all-tests)
이것은 테스트 스위트가 다른 중첩 테스트 스위트를 포함 할 수 있다는 사실을 활용합니다. 이 형식이 run-tests
위의 형식 ( 루프 run-tests
에서 여러 번 호출)보다 더 좋습니다 (단일 호출) 라고 생각합니다 for
.
원래 질문의 모든 문제 test-case
는 test-suite
컨테이너 외부의 인스턴스 를 미리 정의하려는 것이 었습니다 . 그러나 여기 make-test-suite
에서 test-suite
인스턴스 목록을 전달 하여 인스턴스 내의 테스트가 나중에 run-tests
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다