TDD(Test Driven Development) (2)
Python에서 TDD로 진행해보자.
내용이 많아서 분할해서 진행해야겠다 ;(
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