내용이 많아서 분할해서 진행해야겠다 ;(

https://testdriven.io/blog/modern-tdd/ 를 참고하여 공부했다.
이전 글

격리는 해제되었으나, 아직도 코로나의 여파로 기침과 두통이 으… 얼른 나았으면 좋겠다 😥

테스트 코드를 따로 안 만들어도 된다고 주장하는 개발자는 대단히 자기 중심적이고 이기적인 사람이다 - 소프트웨어 장인

@pytest.fixture annotate를 사용하면 test 후에 데이터베이스를 지우고 각 테스트 전에 새 데이터베이스를 생성하는 것이 가능하다.
아래 코드를 보면 중간에 yield가 있다. 본문에 의하면 이 yield 일 때 테스트가 진행된다. (아직 무슨 말인지 크게 와닿지 않는다..)

@pytest.fixture(autouse=True)
def database():
    _, file_name = tempfile.mkstemp()
    os.environ["DATABASE_NAME"] = file_name
    Article.create_table(database_name=file_name)
    yield
@pytest.fixture
def some_fixture():
    # do something before your test
    yield # test runs here
    # do something after your test

윗 글만으로는 잘 이해가 안가서 좀 더 찾아보았다.
@pytest.fixture decorate 를 사용하면 fixture 선언한 함수를 테스트 함수에서 인자로 넣어 사용할 수 있다고 한다.

Fixture가 뭘까?

  • 테스트를 자동화하거나 조절하기 위해 사용됨
  • 테스트 시 필요한 부분 및 조건을 미리 준비한 자원 및 코드
  • 예를 들어 10줄의 row data를 test할 때 사용한다 라고 하면 이 10줄이 fixture가 됨
  • 위에 코드를 보면 그럼 file_name이라는 table이 fixture에 해당됨

본문에서 test_quries.py 코드를 복사해 사용한다.

Flask API

우선 필요한 라이브러리와 Flask를 설치한다.

pip install jsonschema Flask

본문에서 Article과 ArticleList json schema, test_app.py, test_app.py를 복사해 사용한다.
json schema를 따로 정의해서 사용하는 것을 알게되었다.

아래처럼 bad request에 대해서도 테스트를 진행해야한다.

def test_create_article_bad_request(client, data):
    """
    GIVEN request data with invalid values or missing attributes
    WHEN endpoint /create-article/ is called
    THEN it should return status 400
    """
    response = client.post(
        "/create-article/",
        data=json.dumps(
            data
        ),
        content_type="application/json",
    )

    assert response.status_code == 400
    assert response.json is not None

본문에서 보면 아래와 같이 parmetrize라는 어노테이터 가 있다. 이를 이용하면 매개변수를 사용할 수 있다.

@pytest.mark.parametrize(
    "data",
    [
        {
            "author": "John Doe",
            "title": "New Article",
            "content": "Some extra awesome content"
        },
        {
            "author": "John Doe",
            "title": "New Article",
        },
        {
            "author": "John Doe",
            "title": None,
            "content": "Some extra awesome content"
        }
    ]
)

app.py에서도 에러 핸들러라는 어노테이터를 이용하여 핸들링이 가능하다.
기능 설계도 분명 중요하지만 이러한 에러핸들링이 개인적으로 더 중요하다고 생각된다.. 빵빵 터지는걸 너무 많이 경험해봐서..

@app.errorhandler(ValidationError)
def handle_validation_exception(error):
    response = jsonify(error.errors())
    response.status_code = 400
    return response

REFERENCES

https://velog.io/@sangyeon217/pytest-fixture https://twpower.github.io/19-about-python-test-fixture