[질문] go testing 관련 type과 interface 질문입니다.

75 views
Skip to first unread message

anarcher

unread,
Jul 29, 2013, 5:08:11 AM7/29/13
to golang...@googlegroups.com
golang 공부를 이제 시작한 초보입니다.

표준 라이브러리 testing을 사용할때, go test 말고 간단한 TestRunner(예를 들어 HTMLTestRunner)을 만들고 싶어서 testing 쪽을 보고 있는데요.

testing.T가 기본적으로 struct이라서 testing.tRunner의 코드와 비슷한  다른 TestRunner을 만들기 어려운것 같습니다. (제가 golang 관련 공부거 거의 없어서 잘못 이해하고 있는 것 같기도 합니다.)

그래서 테스트 함수의 인자를 struct가 아닌 interface으로 받고 TestRunner을 만들면 가능하지 않을까 생각했었는데요.

type T interface { .... }

func TestTest(t T) { ... }

t := &testing.T{}

TestTest(t)

으로 하면 동작이 되는데.  go test으로 실행하면 동작이 안되더군요..

https://gist.github.com/anarcher/0e5fa8040f3ea9fc218b

$ go run testing.go
2013/07/29 14:33:53 true
 
$ go test
# testmain
/tmp/go-build711170599/_/home/anarch/hg/trashcan/codes/golang/testing/test/_test/_testmain.go:16: cannot use main.TestTest (type func(main.T)) as type func(*testing.T) in field value
FAIL _/home/anarch/hg/trashcan/codes/golang/testing/test [build failed]

질문은 testing.T의 interface을 만들고 interface을 사용하는 함수를 정의하면 interface에 준수하는 어떤 type(struct)가 넘어오더라도 동작을 할것이라고 기대했는데요.
t = &testing.T{} 으로 만들어서는 동작을 하는데. go test에서는 동작을 하지 않는 이유가 궁금해서 질문을 던집니다.

읽어 주셔서 감사합니다.


Jongmin Kim

unread,
Jul 29, 2013, 6:33:17 PM7/29/13
to golang...@googlegroups.com
안녕하세요~

일단 gist에 있는 test_test.go가 에러나는 건 *testing.T가 와야 할 자리에 main.T (T가 정의되어 있지 않은 상태)가 와서 인 것 같습니다.
go test는 *_test.go 파일들만 실행해주니까 testing.go에서 정의된 것과는 별개일 것이구요.

어쨌든 하시고자 하는 것은 T struct를 interface로 만들어서 그 interface를 넘기는 것은 가능한 것이긴 한데, 더 근본적으로 testing 패키지의 tRunner를 따로 구현하시려고 하는 이유가 궁금하고, tRunner도 그냥 T struct를 인자로 받아서 구현이 되어 있는데, 똑같이 그렇게 하시면 안 되는 상황이신 건지 궁금합니다. 답변은 안 드리고 되려 질문만? ㅎㅎ

GDG Korea Golang(Go 언어 사용자 커뮤니티): https://plus.google.com/u/0/communities/115721275599816202991



2013년 7월 29일 월요일 오후 6시 8분 11초 UTC+9, anarcher 님의 말:

anarcher

unread,
Jul 30, 2013, 1:01:15 AM7/30/13
to golang...@googlegroups.com


2013년 7월 30일 화요일 오전 7시 33분 17초 UTC+9, Jongmin Kim 님의 말:
안녕하세요~

일단 gist에 있는 test_test.go가 에러나는 건 *testing.T가 와야 할 자리에 main.T (T가 정의되어 있지 않은 상태)가 와서 인 것 같습니다.
go test는 *_test.go 파일들만 실행해주니까 testing.go에서 정의된 것과는 별개일 것이구요.

제가 golang을 잘 몰라서 그런듯 하네요.
에러 메세지로만 보면, main.T을 찾을수 없다가 아니라 쓸수 없다이라서 정의되어 있지 않은 상태라고 생각하지 않았습니다.
(정확히는 go test할때 어떻게 빌드하고 실행하는지 알아봐야 알수 있을 듯 하네요)
 

어쨌든 하시고자 하는 것은 T struct를 interface로 만들어서 그 interface를 넘기는 것은 가능한 것이긴 한데, 더 근본적으로 testing 패키지의 tRunner를 따로 구현하시려고 하는 이유가 궁금하고, tRunner도 그냥 T struct를 인자로 받아서 구현이 되어 있는데, 똑같이 그렇게 하시면 안 되는 상황이신 건지 궁금합니다. 답변은 안 드리고 되려 질문만? ㅎㅎ

관련 이슈가 있나 검색을 해보았는데, 아래와 같은 티켓이 있긴 합니다. (저도 대략 비슷한 이슈라고 생각합니다.)

 Issue 3343:    testing: API should be general purpose
https://code.google.com/p/go/issues/detail?id=3343&q=testing%3A&colspec=ID%20Status%20Stars%20Priority%20Owner%20Reporter%20Summary


초보자로써 짧은 생각은,  xUnit같은 구조가 설계면만 보면 나쁘지 않은 결정이었을 것 같다는 생각이 드는 군요.
사실 다른 테스팅 도구를 찾아봤는데, gocheck말고 찾지 못했습니다.

ps) 답글 주셔서 감사합니다. :)

 
Reply all
Reply to author
Forward
0 new messages