CS/기타

테스트 코드 작성

12.tka 2022. 3. 25. 17:53
728x90

목적: 자동화된 테스트 코드 작성

사람의 눈으로 결과를 확인하는 수동 테스트는 반복하기 힘들고, 실수 가능성이 크고, 시간도 오래 걸린다.

 

테스트 코드의 필요성

테스트 코드를 작성함으로써 얻는 장점은 너무나 많다. 기능 추가 및 수정으로 인한 부작용을 줄일 수 있고, 디버깅을 쉽게 해주고, 반복적인 작업들을 하지 않도록 도와주며, 전체적으로 재사용성이 좋은 코드 작성을 가능하게 한다. 하지만, 테스트 코드를 작성하지 않는 프로젝트들이 아직 많이 존재한다. 대부분의 이유는 아래 사진과 같이 개발 초기에 테스트 코드를 작성하는 것이 비효율적이라고 생각하기 때문이라고 추측한다. 하지만, Breakeven 지점을 지나면 테스트 코드를 작성함으로써 생기는 단점은 전혀 없다고 생각한다.

 

테스트 원칙

소프트웨어 테스팅 분야에서 40여년 간 발전해 온 일곱 개의 기본 원칙은 다음과 같다.

  • 테스팅은 결함의 존재를 보여주는 것이다.
  • 완벽한 테스트는 불가능하다.
  • 테스트 구성은 가능한 빠른 시기에 시작한다.
  • 결함은 군집되어 있다.
  • 비슷한 테스트가 반복되면 새로운 결함을 발견할 수 없다.
  • 테스팅은 정황에 의존적이다.
  • 사용되지 않는 시스템이나 사용자의 기대에 부응하지 않는 기능의 결함을 찾고 수정하는 것은 의미가 없다.

그 외에 FIRST 원칙도 있다. (참고 링크)

  • [F]ast : 단위 테스트 (unit test)는 빨라야 한다.
  • [I]solated : 다른 테스트에 종속적인 테스트는 작성하지 않는다.
  • [R]epeatable : 테스트는 실행할 때마다 결과가 같아야 한다. (수정이 발생하지 않는 한)
  • [S]elf-validating : 테스트는 스스로 결과물이 옳은지 그른지 판단할 수 있어야 한다.
  • [T]imely : 테스트는 적시에 작성해야 한다.
    • 단위 테스트는 테스트 하려는 실제 코드를 구현하기 전에 구현해야 한다.

 

테스트 전략

  • 단위 테스트 (unit test)
    • 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
    • 모듈은 애플리케이션에서 작동하는 하나의 기능 혹은 메소드로 생각하면 된다.
    • TDD(Test-Driven Development, 테스트 주도 개발)에서 이야기하는 테스트는 단위 테스트를 의미한다.
    • 대부분 테스트 대상을 사용하는 사람이 아니라 작성한 사람이 수행하는 테스트이다. (white-box test)
    • 단위 테스트는 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체와 메세지를 주고 받는 경우에 문제가 생길 수 있다. 따라서, 가짜 객체(Mock Object)를 사용하여 정해진 결과를 반환하라고 준비시켜야 하는데, 이를 stub이라고 한다.
  • 통합 테스트 (integration test)
    • 단위 테스트와 달리 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다.
    • 단위 테스트 이후, 각 모듈들의 상호 작용이 제대로 이루어져있는지 검증하는 테스트이다.
    • 하향식, 상향식, 샌드위치 방식의 테스트가 존재한다.

 

좋은 테스트 코드란

요구 사항은 계속해서 변하고, 그에 맞춰 코드도 계속해서 변한다. 그렇기에 실제 코드를 테스트하는 테스트 코드도 계속해서 변경될 수 밖에 없다. 따라서, 테스트 코드도 가독성있게 작성할 필요가 있다.

 

Python Test Code

Python의 대표적인 테스트 코드 관련 라이브러리는 pytest, unitest이다. pytest, unittest 사용법은 크게 어렵지 않아서 무엇을 사용해도 상관없을 것 같다. 테스트 코드를 어떻게 작성할 것인지 설계하는게 가장 중요하다고 생각한다.

  • pytest
    • pytest 공식 홈페이지에서는 pytest는 더 나은 프로그램을 작성하는 데 도움이 되는 완전한 기능을 갖춘 Python 테스트 도구라고 나와있다. 참고로, pandas와 SQLAlchemy에서는 pytest를 통해 코드 테스트를 진행하고 있다고 한다.
    • 테스트를 작성하는 데 있어 함수만 정의하면 되므로 편리하다.
  • unittest
    • pytest와 달리, 테스트를 작성하기 위해 반드시 클래스를 정의해야 한다.
    • 카멜 케이스로 단어를 구분한다. (pytest는 언더스코어로 단어를 구분) 참고로, 파이썬 스타일 가이드에서는 언더스코어로 단어를 구분하는 것을 권장함. (물론 프로젝트의 일관성을 유지하는 것이 우선순위가 높다) 아마 unittest는 1999년에 만들어졌고, 파이썬 스타일 가이드는 2001년에 처음 만들어져서 카멜 케이스로 단어를 구분하는 것 같다. 물론 테스트 코드와 전혀 관련없는 이야기다..!
728x90

'CS > 기타' 카테고리의 다른 글

API vs Library vs Framework  (0) 2021.01.02