프로그램을 짤 때 테스트셋은 어떻게 만드시나요?

eunhyeon의 이미지

학부 수업 과제로 SQL을 사용하는 간단한 DBMS을 만들고 있습니다.
wc로 줄 수를 계산해 보니, 2859 줄이네요. 대충 빈칸이나, 주석을 빼도 2000줄은 넘길 것 같습니다.
과제로 프로그래밍을 한 것은 여러번 있지만, 2000줄은 넘긴 것은 처음이어서 나름 뿌듯해 하고 있습니다.

그런데 생각보다 디버깅이 힘들더군요.
소스 코드를 무식하게 짠 이유도 있습니다만,
데이터 형식, NULL, Primary Key 등에 의해서 생기는 조건의 분기나 체크를 제대로 확인하지 않아서 생기는 문제도 많았습니다.

일반적인 경우에는 잘 동작하는 것 같으면서도, 일부 특정한 경우에만 오류가 발생한다든지 해서 피곤하게 하더군요.
지저분하게 짜둔 탓에 하나를 고치면 다른 하나가 고장나는 경우도 생기구요.

그래서 모든 경우를 점검할 수 있는 테스트 셋을 만드려고 시도 하였는데, 이게 또 생각처럼 쉽지 않더군요.
필요한 최소한의 경우의 수를 계산해 보았더니, 당장 고려되는 것만 하더라도 1000개가 넘어갑니다.
생각지도 못한 것이 더 필요하다면 엄청 더 늘겠더군요.

KDLP 분들은 보통 테스트셋을 어떻게 작성하시나요?
테스트셋을 만드는 노하우가 있으면 전수해 주셨으면 합니다. ^^

mirr187의 이미지

저같은 경우에는 cunit을 이용하거나 아니면 별도의 테스트셋을 만듭니다.

cunit같은 경우에는 설치할 수 없는 경우도 있어서 아래와 같이 ifdef 로 해놓고 컴파일 옵션을 주어서 테스트하곤 합니다.

뭐.. 예를 들자면...

#ifdef S_TEST
func1(arg1);
func1(arg2);

func2(arg1, arg2);
..
..
#endif

테스트셋은 한번에 만들려면 귀찮기도 하고 손도 많이 가게 되어서 하나의 function 을 만들면 바로바로 만들어 두고 있지요...

위와 같이 테스트를 할 수 없다 싶으면.. script로 만들어서 돌리기도 하는데... case by case죠.. ㅎㅎ

johan의 이미지

테스트 케이스를 잘 만들려면 원래 코드가 테스트하기 쉽게 작성되어야 합니다. 저는 TDD를 안하면서도 대부분의 경우 비교적 테스트하기 쉽게 코딩하지만, 그렇게 안된다면 TDD 등을 해보는 것도 괜찮습니다. 즉, 테스트 케이스를 먼저 생각하면서 코딩해야 테스트하기 쉽습니다.

경우의 수는 잘 생각해보면 줄일 수 있고, 워낙 확실한 것은 구태여 테스트 할 필요 없습니다. 주로 바운더리 컨디션을 꼭 테스트 해봐야 할 겁니다.

elflord의 이미지

등가분할법이나 경계치 분석법등의 테스트 방법론을 이용하시면 테스트해야할 케이스를 상당히 줄이실 수 있을 것 같습니다.

===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

lacovnk의 이미지

음. 아마 제가 들었던 수업일지도 모르겠네요 ㅎㅎ

일단 모든 경우의 수를 고려하기 보다는 기능 넣으면서 차근차근 추가해넣으세요.

정 모든 경우를 고려하고 싶다면 테스트 셋을 만드는 프로그램을 만드세요.

...그러나 학부 과제라면 "조교가 테스트 한다고 한 기능"만 집중적으로 하면 편해집니다. 영 그러면 조교에게 테스트 셋을 올려달라고 하든가요.

아 그리고 대소문자 섞인 것 처리도 빼먹지 마세요. 무심결에 코드 고쳤다가 제 테스트 셋은 소문자, 조교 테스트 셋은 대문자라 모두 에러났었습니다 OTL

sql2의 이미지

일단 SQL 파서를 lex&yacc 를 이용하셨다면 상당히 문제가 힘들어집니다.
( lex&yacc 가 코드를 생성해내기 때문입니다. 유닛테스트시 이놈은 무시하도록 하는 것이 좋습니다.)

순수하게 스캐너+파서 합쳐진 형태로 코딩하셨다면 코드가 상당히 지저분 할겁니다.
( 이 소스를 극한까지 깔끔하게 만드시면 lex&yacc 소스에 가까워 질겁니다. 컴파일러 책에 그렇게 써있더군요. )

결국 필요하신 것은 유닛테스트 + SQL 테스트 인데요.

MySQL SQL 테스트유닛을 보시면 도움이 되실겁니다. 펄로 되어 있습니다.
( PostgreSQL 테스트셋이 보기 더 좋을 것 같습니다. ^^; )

근데 쉽지 않을 것 같습니다. SQL 도 SQL92 풀스펙지원해도 상당히 변경해야 할 겁니다.

parasoft 사의 C++Test 평가판 받으시면 유닛테스트는 쉽게 해결하 실수 있을 겁니다.
( 저는 받아보지 않아서, 쉽게 제공해주는지 모르겠습니다.
비싼 소프트웨어들 같은 경우 국내총판, 지사에서 방문설치해주는 경우도 있고, 학생은 저리가라고 하는 경우도 있어서.. )

http://www.parasoft.com/jsp/products/home.jsp?product=CppTest&

SQL 테스트셋은 MySQL SQL 테스트셋을 참고하셔서 만들면 될겁니다.
( 배보다 배꼽이 커질 수도 있습니다. 코딩보다 더 많은 작업을 하실 수도 있습니다. )

NIST 꺼도 있지만 요넘 작업은 만만치 않을겁니다.
( FIPS PUB 127-2 만족안하면 사실 무용지물일 겁니다. )

NIST SQL Test Suite
http://www.itl.nist.gov/div897/ctg/sql_form.htm

과제가 SQL 표준에 가깝다면 아래의 사이트가 유용할 겁니다. syntax 에러시 어느 feature 였는지도 알려줍니다.
http://developer.mimer.se/validator/index.htm