[TIL]Unit Test

여주링·2021년 1월 2일
1

TIL

목록 보기
3/13

배포하기전, 개발자들은 이게 문제없이 돌아갈지 테스트를 한다. 테스트의 방법에도 여러가지가 있는데 그에 대해 알아보겠다

시스템 테스트 방법

Test Pyramid

Google Test Automation Conference에서 제안된 테스트 피라미드로 3가지의 테스트방법의 비율을 권고하는 피라미드이다

  • E2E(UI) Testing - 10%
  • Integrating Testing - 20%
  • Unit Testing - 70%

1.End-To-End(E2E) TEST

위코드 1차 프로젝트에서 프론트분들이 크롬을 띄워 실제로 동작시키던게 이것!

크롬 브라우저를 띄운다음에 내가 만든 페이지로 들어가서 직접 하나하나 값을 입력해서 확인하는 방법이다.
시스템 테스트중 가장 까다롭고 어려운 방법이다. 자동화에 있어서도 매우 까다로운 방법이다.

2.Integrations Testing

Httpie or Postman으로 테스트하던 백엔드분들이 바로 이것!

두개이상의 클래스 or 서브 시스템의 결합을 테스트하는 방법이다. E2E Testing다음으로 시간적, 재정적 소모가 많이 되는편이다.

3.Unit Test

자세한 내용은 밑에 기술!

Unit Test란?

유닛테스트란, 내가 작성한 코드의 가장 작은 단위를 테스트하는 메소드를 말한다. (여기서 가장 작은 단위는함수이다)

위코드 1차 프로젝트에서 나는 프론트와 맞춰보기전
1.httpie를 통해서 혼자서 테스트 ->Integrating Testing
2.프론트와 맞춰서 테스트 -> E2E(UI) Testing
이 두가지 방식을했는데, 이 방법보다 더 작은 단위로 나눠서 테스트를 하는것이다.

Unit Test의 장점

  • 다른 테스트보다 비용이 싸다. 왜냐 사람이 스크립트로 한번에 자동으로 실행하기때문!
  • 다른 테스트들에 비해 실행 속도가 매우 빠른 편. -> 2차 프로젝트에서 사용하길 권장하는 이유가 바로 이것때문!
  • 한번 Unit Test를 잘 짜두면 중장기적으로 유지보수가 쉬워진다.
  • 모든 함수,매서드마다 테스트를 하기때문에 코드자체의 오류발생가능성이 희박하다. 나중에 발견된 버그에 대한 부분을 수정후 또 유닛테스트만 해주면 됨

Unit Test의 일반 원칙(몇가지만)

  • 테스트 유닛은 각 기능의 가장 작은 단위에 집중해야함. 그 단위가 잘 실행하는지 증명하는게 목적
  • 각 테스트 유닛은 반드시 독립적이야 한다. 하나의 테스트로도 되고 여러테스트가 모인 상황에서도 잘 굴러가야한다(⭐️호출되는 순서와 무관하게 잘 동작해야 한다⭐️)
  • 테스트가 빠르게 돌 수 있도록 만들기 위해 노력해야 한다. 만일 테스트에 필요한 데이터 구조가 너무 복잡하다면 이를 따로 분리하여 별도의 테스트 슈트를 만들어 두고 스케쥴 작업을 걸어두자
  • 그날의 코딩을 시작하기 전에 항상 풀 테스트 슈트를 돌려야 한다.
  • 코드를 디버깅할 때 가장 먼저 시작할 일은 버그를 찝어내는 새로운 테스트를 작성하는 것도 추천
  • 테스트 함수에는 길고 서술적인 이름을 사용해야한다. 안그러면 엄청난 일이 일어날것이다🙃

Unit Test 개발 가이드

Python의 unittest 모듈을 사용하여 유닛 테스트를 개발할때 일반적으로 다음과 같은 절차를 따른다.

1. 먼저 unittest 모듈을 import 한다.

import unittest

2. unittest.TestCase 클래스를 상속하는 테스트 클래스를 만든다.

class MyCalcTest(unittest.TestCase):

3. 테스트 클래스 안에 test_ 로 시작하는 테스트 메서드를 생성한다.

def test_add(self):

4. 테스드 메서드에서는 일반적으로 테스트하고자 하는 함수나 메서드를 호출하고 그 결과값을 self.assert*() 메서드를 사용하여 확인한다. (assertEqual, assertTrue, assertFalse, assertRaises, assertRegex 등 다양한 assert 메서들을 사용할 수 있다).

def test_add(self):
    c = myCalc.add(20, 10)
    self.assertEqual(c, 30)

5.테스트 클래스가 완성되었으면, unittest.main()을 호출하여 테스트를 실행시킨다.

Unit Test 예제

  • mycalc.py
def add(a, b):
    return a + b

def substract(a, b):
    return a - b
  • tests.py
import unittest
import mycalc

class MyCalcTest(unittest.TestCase):

    def test_add(self):
        c = mycalc.add(20, 10)
        self.assertEqual(c, 30)

    def test_substract(self):
        c = mycalc.substract(20, 10)
        self.assertEqual(c, 10)
if __name__ == '__main__':
    unittest.main()
> python -m unittest --v
test_add (test_my_calc.MyCalcTest) ... ok
test_substract (test_my_calc.MyCalcTest) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

2차 프로젝트부터 모든 과정을 다 유닛테스트를 실행하고 github에 push할 예정이다. rebase와 더불어 엄청난 공포의 존재지만 한번 도전해보자! 화이팅

profile
🌱Backend Developer👩‍💻

0개의 댓글