Python

[TEST] 2.테스트 코드 작성하기

foxlee 2021. 10. 24. 23:57

이전 글 2021.10.23 - [개발 고민들] - [TEST] 1. 테스트를 시작하게 된 계기

 

코드

 

# tests/conftest.py
@pytest.fixture
def client():
    app = create_app()
    app.config["TESTING"] = True
    app.testing = True
    with app.test_client() as client:
        app.config["SQLALCHEMY_DATABASE_URI"] = "db url"
        with app.app_context():
            db.create_all()
            yield client
            db.session.rollback()
            db.session.close()
            # db.drop_all() # 모든 테스트에서 테이블 삭제로 인한 속도가 느려짐 

# 테스트 속도 향상을 위해 모든 테스트가 끝난 후에 db 테이블 삭제
def pytest_sessionfinish(session, exitstatus):
    """whole test run finishes."""
    app = create_app()
    app.config["SQLALCHEMY_DATABASE_URI"] = "db url"

    with app.app_context():
        db.drop_all()
# tests/test_action.py 의 일부분

def test_get_action_by_id(client, api_helpers):
    # arrange - create action
    data = {"name": "test-action-by-id"}
    url = "/api/actions/"
    response = client.post(url, data=json.dumps(data), headers=api_helpers.headers)
    action_id = api_helpers.convert_response_to_dict(response)["result"]
	
    # act
    get_response = client.get(f"/api/actions/{action_id}")

    # assert
    assert get_response.status_code == 200

 

테스트 코드을 작성하며...

  1. 먼저 테스트 코드 작성(다양한 케이스 생각하고 개별 테스트 함수 생성)
  2. 해당 테스트를 통과하기 위한 기능 추가 또는 수정
  3. 해당 기능 리팩토링
  • 위 순서를 지키기 위해 노력했으나 보통 1,2이 섞이고, 2,3이 섞이면서 개발을 진행했던거 같다. 
  • 1번을 진행하며 해당 기능에 정확한 역할에 대해 생각해 보고 다양한 테스트 케이스 생각하기
  • 2번을 진행하며 일부/전체 테스트 진행하여 다른 기능에 영향을 주는 지 확인
  • 3번 리팩토링(가독성, 네이밍, 의존성 등 고려)