Software Testing

강현구·2022년 1월 12일
0
post-custom-banner

Software Testing

test flow
어떤 input에 대해서 원하는, 예상하는 output이 나오지 않을 경우 수정(Modify&Fix)을 한다.

  • build product right (제품을 잘 만들었는가?)
  • build right product (맞는 제품을 만들었는가?)

왜 테스트를 하는가?

  1. 결함 확인
  2. 사전 방지
  3. 시간 절약
  4. 구조 개선
  5. 품질 개선
  6. 확장성

Manual Testing

  • 불안정성이 높아진다. (사람은 실수를 한다!!)
  • 인력소모가 높다.
  • 비용이 많이든다.
  • 테스트 속도가 느리다.
  • 확장성이 낮다!

Automation Testing

  • 안정성이 높다.
  • 인력소모가 낮아진다.
  • 비용이 줄어든다.
  • 테스트 속도가 빠르다.
  • 확장성이 높다!

시스템 테스트 전략

  1. End-to-End (E2E) Tests
  • 전체적인 Flow
  • 실제 프론트/백 엔드의 서버가 연결된 상태에서 요청이 보내졌을 때, 정상으로 작동하는지를 확인
  1. Integration Tests (통합 테스트)
  • 모듈 간의 호환성 검증
  • httpie, postman 같은 걸로 서버 검증(기능 단위의 작동을 확인)
  1. Unit Tests (단위 테스트)
  • 독립적으로 진행되는 가장 작은 단위의 테스트 (함수 단위)

3 -> 2 -> 1 순서대로 복잡도가 올라간다.
테스트 비중: E2E 10%, integration 20%, Unit 70%의 비중으로 테스트하는 것이 일반적으로 올바르다.
즉, 테스트는 유닛 테스트의 비중이 제일 크다
Test Pyramid

Test

End-to-End Tests
ex) cypress

Integration Tests
ex) postman

Unit Tests
유닛 테스트가 있는 코드에서는 작업 시작 전에 코드를 다 돌려보고,
작업 후에 테스트를 다시 돌려서 이상이 없는지를 확인한다!

유닛 테스트를 통해서 input/output이 한번에 보이기 때문에 기능의 확인이 쉽다.

Unit Test

Python

Python의 unittest 모듈을 사용

  • TestCase :
    unittest 프레임 워크의 테스트 조직의 기본 단위

  • Fixture :
    테스트를 진행할때 필요한 테스트용 데이터 혹은 설정 등을 이야기 한다.
    주로 테스트 가 실행되기 전이나 후에 생긴다.
    (테스트하기 위해 미리 넣어주는 데이터, 테스트용 table은 빈 상태로 시작한다.)

  • assertion :
    unittest에서 테스트 하는 부분이 제대로 됬는지를 확인하는 부분.
    Assertion이 실패하면 테스트도 실패한다.

테스트 케이스는 독립적이어야 한다.
그래서 unit Test를 Fixture로 할 때,
준비는 setUp()메서드로, clean up 처리는 tearDown()메서드로 처리한다.

Django

django에서는 자동으로 생성되는 tests.py를 통해 unit test를 진행한다.
기본적으로 unittest를 위해 TestCase 클래스와 Client() 객체를 제공한다.

test.py에서 테스트용 클래스를 import하고
테스트 class를 만든 후에 제일 먼저 setUp메서드로 테스트할 수 있는 데이터를 DB에 만들어 줘야한다.
DB 자체는 django에서 테스트할 때 자동으로 생성하고 없애준다.
여러개의 테스트 데이터 입력할 때는 그냥 create말고도 bulk_create를 사용할 수 있다.
원래는 id가 자동 생성이지만 테스트할 때는 id도 입력해줘야 혼선을 막을 수 있다.
Client() 클래스 사용을 위해 인스턴스를 생성하고 그 인스턴스화된 객체로 테스트를 진행한다.
여기서의 client가 프론트엔드의 기능을 하게된다.

post메서드와 같은 것은 바디에 데이터가 들어가 있어야하므로 post의 바디에 들어갈 data를 dict에적고 그것을 dumps(dict) 메서드로 json 바디를 만들어 준다.

Mocking

requests는 외부 API를 사용하기 위한 메서드!
@patch("users.views.requests") 부분에서 requests를 만나면 실행하지말고 이쪽으로 돌려서처리
우리는 카카오로부터 response로 카카오 계정정보를 받아서 response.json 으로 풀어서 쓰고싶은건데
그 데이터가 없으니까, Mockedresponse가 실행되게 한다.
이 안에서 json 메서드 안에서 실제 내가 카카오로 부터 받고 싶은 데이터를 mock으로 만들어준다.

TDD(Test Driven Development)

profile
한걸음씩
post-custom-banner

0개의 댓글