Unit test

홍진우·2022년 4월 5일
0

Back-End

목록 보기
9/10

테스트 자동화의 중요성

시스템을 테스트하는 데에 있어서 가장 중요한 것은 테스트의 자동화 (automation test)
테스트를 최대한 자동화해서 테스트가 반복적으로, 그리고 자주 실행될 수 있도록 해야하며, 또한 항상 정확하게 그리고 빠지는 부분이 없도록 테스트가 실행되도록 하는 것이 중요함.
시스템을 테스트하는 방법은 기능만을 고려했을 경우 크게 아래의 3가지로 나눌 수 있음. (물론 아래의 3가지 외에도 performance test, load test 등 속도나 확장성과 관련한 테스트도 존재)

  • ui test / end-to-end test
  • integration test
  • unit test

UI test / End To End test

ui test (end-to-end test)는 시스템의 ui (user interface)를 이용하여 테스트하는 것을 칭함. (e.g. 웹사이트를 테스트하기위해서, 웹 브라우저를 통해 웹사이트에 실제로 접속하고 ui에 직접 입력하고 클릭하는 등, 기능이 정상적으로 작동하고 화면이 정상적으로 작동하는 지 테스트)

  • 장점
    사용자가 실제로 시스템을 사용하는 방식과 가장 동일하게 테스트할 수 있음.
  • 단점
    시간이 많이 소요됨. (프론트엔드부터 백엔드까지 모든 시스템을 실행시키고 연결해야 할 수 있는 테스트)
    자동화하기 까다로움.

ui test는 사용자가 사용하는 것과 동일한 방식으로 테스트를 한다는 장점 때문에 꼭 필요한 테스트이긴하나, 언급한 단점들 때문에 다른 테스트 방식에 비해 비중을 가장 적게두는 것을 추천

integration test

API 서버를 로컬에서 실행시킨 후 터미널에서 테스트용 HTTP 요청을 로컬에서 실행되고 있는 API 서버에 전송하여 올바른 HTTP 응답이 리턴되는지 확인하는 메커니즘.

integration test는 테스트하고자하는 해당 시스템 (그룹단위로 기능을 묶은 모음체)만 실행시켜서 테스트하는 것
실제 시스템을 실행시켜서 진행하는 테스트라는 점에서 앞서 보았던 ui test / end-to-end test와 비슷하지만, ui test는 서비스를 구성하는 모든 시스템을 실행하고 연결한 후 테스트를 진행하나, integration test는 테스트하고자하는 해당 시스템만 실행시켜 테스트한다는 점에서 차이점

  • 장점
    하나의 시스템만 실행해서 테스트하므로 ui test에 비해 테스트 설정이나 실행 시간이 더 짧고 간단함.
    대부분의 integration test는 백엔드 API 시스템처럼 UI적인 요소가 없는 백엔드 시스템에서 실행하기 때문에, 자동화하기에도 ui test보다 더 용이함.
  • 단점
    시스템을 실행해서 테스트를 진행해야하므로 여전히 까다로운 부분이 존재함.
    unit test에 비해 자동화에 걸리는 공수가 더 크고 실행속도가 느릴 수 밖에 없음.

unit test

unit test는 시스템을 직접 실행하여 테스트하는 ui test, integration test와는 달리 코드를 직접 테스트하는 개념임. unit test라는 이름에서 unit이라는 단어가 들어가 있는 이유는 테스트가 가능한 코드의 unit (단위)들을 테스트한는 의미임. 일반적으로 테스트 가능한 코드 unit들은 일반적으로 함수 (그리고 메소드)임

  • 장점
    실행하기가 쉬우며 실행 속도가 빠름.
    디버깅하기가 용이함.
  • 단점
    함수 단위로 테스트를 하다 보니 전체적인 부분을 테스트하는 데에 있어 제한적임.
    모든 함수가 제대로 작동하는 것을 테스트했다고 하더라도 전체적인 하나의 서비스로 연결되어 실행되었을 때도 정상적으로 작동하는 지에 대해서는 확신하기 힘듦.
    UI test 또는 integration test를 통해서 보완할 수 있음.

pytest

pip install pytest
  • pytest는 파일 이름의 앞부분에 test_라고 되어잇는 파일들만 테스트파일로 인식하고 실행
  • 함수의 경우도 함수 이름 앞부분에 test_라고 되어있는 함수들만 실제 unit test 함수로 인식하고 실행
# test_multiply_by_two.py
def multiply_by_two(x):
    return x * 2


def test_multiply_by_two():
    assert multiply_by_two(4) == 7

실행결과

===================================== test session starts ======================================
platform darwin -- Python 3.8.5, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: /Users/kbs/Documents/archive/flask101/Chapter08
collected 1 item

test_multiply_by_two.py F                                                                [100%]

=========================================== FAILURES ===========================================
_____________________________________ test_multiply_by_two _____________________________________

    def test_multiply_by_two():
>       assert multiply_by_two(4) == 7
E       assert 8 == 7
E        +  where 8 = multiply_by_two(4)

test_multiply_by_two.py:6: AssertionError
=================================== short test summary info ====================================
FAILED test_multiply_by_two.py::test_multiply_by_two - assert 8 == 7
====================================== 1 failed in 0.09s =======================================

에러 발생시 AssertionError return

profile
Yonsei Univ. Sports Industry studies/ Computer Science / Applied Statistics

0개의 댓글