[edit]
1 들어가기 전에 #SQA (Software Quality Assurance)에 대해서 글을 써보려고 하는데, 왜 첫 주제 (제목)가 이 것일까? 조직의 성숙도 - CMM이나 SPICE에서 말하는 - 가 낮거나 높거나 이 것은 중요한 문제이고, SE 또는 SQA의 존재 여부를 결정하는 조직 (또는 개인)의 의지 (will)와도 관계가 있기 때문에 첫 주제로 선택했다. 이 글은 테스트 - 단위 테스트 (unit testing) ~ 시스템 테스트 (system testing) - 를 누가 해야 하는지에 대한 답에 관해서다룬다. [edit]
2.1 단위 시험은 개발자가 #한 모듈 - module, component, 또는 단 하나의 함수 등 - 을 맡은 개발자는 책임 (responsibility)을 가지고 자신이 맡은 것에 대해서 검증 (validation & verification) 해야 한다. 하지만, 우리는 현실 - 일정 (Schedule)과 Man/Month - 을 이야기 한다.
하지만, 위 모든 질문들은 악순환을 막기 위해서 감수해야하는 일들이기도 하다. 단위 시험을 개발자 스스로 꼭 해야 하는 이유는
SQA의 Testing에서 말하는 V 모델에서 개발자가 수행하는 단위 시험 (unit testing)은 제일 아래 - 구현과 pair로 - 에 있고 그 것의 의미를 V를 지탱하는 테스트 (엄밀하게는 dynamic testing에서)의 초석으로 생각해도 될 것이다. TDD (Test Driven Development)와 같은 기법이 나온 것이 이와 같은 이유에서 일 것이다. (※ 이 주제는 Regression Testing에서 좀 더 다뤄야할 주제이지만) [edit]
2.2 통합 시험은 개발팀내 Integrator가 (특정 경우 개발자 자신이) #통합 시험 (Integration Testing) 자체가 포함할 수 있는 것은 광범위할 것이다. 모든 모듈들을 통합 후,
일정과 조직에 따라 이런 통합은 매일 일어날 수도 있고, 한 주에 한 번씩 또는 특정 phase에 한 번씩 일어날 수도 있을 것이다. 하지만 중요한 것은 이런 통합 시험은 통합이 일어날 때 마다 Integrator가 책임지고 수행해주어야 할 것이다. 통합이 일어나고 소프트웨어가 거대한 공룡이 되어 블랙박스 형태로 제 3의 조직 (third-party)에 넘겨지기 전에 어머니가 딸을 보내는 것 처럼 정성을 다해 개발 조직 내에서 수행해야 할 것이다. 꼭 개발팀 내에서 해야하는 이유는 위에서 언급한 통합 시험의 형태와 연관지어 보면 다음과 같다.
만약 당신이 코드 기반의 단위 시험 테스트 케이스를 작성했다고 가정한다면, 단 한 마디의 설명 없이 (설령 관련 문서가 있다고 하더라도) 제 3자가 당신의 단위시험 테스트 케이스를 당신의 모듈과 함께 컴파일해서 수행해 볼 수 있을 것인가? 컴파일해서 수행한다고 해도 수행 결과가 pass인지 fail인지 제 3자가 쉽게 알 수 있을까? 아무리 JUnit, CppUnit, CUnit, CUTest, CXXUnit, JsUnit, NUnit으로 코드 기반의 테스트 케이스를 잘 작성하고 테스트 케이스 명세서 (Test case specification document)를 잘 작성해두었다고 해도 제 3자가 당신의 단위 시험을 대신해주기 위해서는 시간이 걸릴 것이다. 이 것은 개발 팀내의 Integrator도 마찬가지겠지만, 그는 각은 팀 내에 있기 때문에 의사 소통이 좀 더 용이하고 다른 조직의 테스터 보다 소프트웨어에 대한 도메인 지식 (Domain Knowledge)이 많기 때문에, 제 3 조직 보다 수월하게 당신의 단위 시험 테스트 케이스를 충실히 돌릴 수 있다.
정적 분석을 도구를 사용하지 않고 리뷰 (review)나 inspection을 통해서 수행한다면 당연히 도메인 지식이 있는 각 개발자나 integrator가 수행해야 할 것이다. 동적으로 이 것을 체크 한다면 두 번째 형태의 이유와 같이 소프트웨어에 대한 지식이 있는 개발팀 내 구성원이 수행해야 할 것이다. [edit]
2.3 시스템 시험은 제 3의 조직이 #시스템 시험 (System testing)의 경우 블랙 박스 테스팅 (Black box testing)의 형태로 매뉴얼 테스트 (manual testing)가 되어지는 경우가 많을 것이다. (물론 TestQuest와 같은 자동화된 도구를 사용할 수도 있을 것이다, 그리고 코드 기반으로 Gray box testing을 수행할 수도 있을 것이다.) 이 것을 제 3의 조직이 하는 것에 대해서 불만을 내보일 개발 조직은 없을 것이다. (누군가가 대신 먼가를 해준다는 관점에서) 하지만 어떤 경우 - 제 3의 조직이 없는 경우, 개발팀 내에서 시스템 시험을 하는 경우가 있다. 우선, 누구든 시험을 하는 것 자체만으로도 고마운 것이 현실이지만, 이 형태가 좋다고는 말할 수 없다. 위의 단위 시험과 통합 시험 이야기에서 테스트 대상 소프트웨어의 도메인 지식이 풍부한 개발자가 수행하는 것이 무엇이 나쁘겠는가? 라고 반문할 수도 있겠지만 이유는 다음과 같다.
Test engineer (system testing을 수행 중인): 이 거 제대로 동작하지 않고 죽는데요.. defect이 아닌지요? (공손하다) Developer:끙... 이렇게 짜는 사람이 어디있어요? 당연히 이거 먼저 해주셔야죠? (짜증이다) Defect 아닙니다. Test case 잘 못 만드셨네요!! Test engineer: ... Test engineer가 임시직이나 신입 사원에 가까울 수록 위의 대화는 더 거칠어 질 수 있다. 천국에 가고 싶은 개발자라면 - 이 세상 고생하는 모든 개발자들은 모두 천국에 가야겠지만 - 가슴에 손을 올리고 생각해보라. 테스터가 위와 같은 실수를 하지 않도록 당신 모듈에 대한 요구 명세서 (Requirement Specification)이나 구조/상세 설계서를 잘 작성해두었는가? 코드 기반의 시스템 테스트라면 Programmer Guide 문서를 잘 작성해두었는가? 그리고, 테스터의 실수를 당신의 코드가 제대로 예외 처리해주고 있는가? 테스터의 실수는 고객의 실수일 수도 있다. "어떠한 상황에서도 이 값이 들어올 수 없습니다." 라고 마음속으로 또는 직접 말로 할 수도 있겠지만, 당신은 신이 아니다. 내가 본 어떤 곳에선 자석을 제품에 가까이 대었을 때 자기장으로 bit들이 바뀌는 상황에 대한 예외 처리를 하는 것을 본 적이 있다. 믿거나 말거나 요지는, 당신이 아닌 제 3자의 어린 아이 눈과 같은 객관성으로 당신의 코드와 코드의 예외 처리와 필요한 문서를 점검하는 것이 시스템 테스트이기 때문에 제 3의 조직 (thirdparty)가 시스템 테스트를 수행하는 것이 바람직하다. |

믿거나 말거나