assert condition
assert 1
assert 1==1
assert 1==2
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-36-529b3dba3ebd> in <module> 1 assert 1 2 assert 1==1 ----> 3 assert 1==2 AssertionError:
assert 1==2, "이건 참이 아니지요"
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-35-a4db5263a64b> in <module> ----> 1 assert 1==2, "이건 참이 아니지요" AssertionError: 이건 참이 아니지요
int_value = 3
assert type(int_value) == int
assert type(int_value) == str
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-39-6b45681bf9aa> in <module> 1 int_value = 3 ----> 2 assert type(int_value) == str AssertionError:
파이썬 내장 라이브러리인 unittest보다 사용하기 직관적인 pytest를 추천함
설치
pip3 install pytest
Test하는 방식
자 간단한 것부터 해봅시다
%%writefile -a utils.py
# 이 파일을 실행하면 utils.py에 파일이 저장됩니다
import datetime
def is_working_day(date: datetime.date):
"""
date를 받아서 근무일인지 확인하는 함수
연휴는 고려하지 않고, 토/일은 근무일이 아니고 월~금은 근무일
"""
weekday = date.weekday()
if weekday in {5, 6}:
return False
else:
return True
Appending to utils.py
%%writefile test_utils.py
# test_utils.py를 아래 내용으로 저장합니다
from utils import is_working_day
def test_is_working_day():
assert is_working_day(datetime.date(2020,7,5)) == False
assert is_working_day(datetime.date(2020,7,4)) == False
assert is_working_day(datetime.date(2020,7,6)) == True
Overwriting test_utils.py
!pytest test_utils.py
# pytest를 실행합니다!
Test session starts (platform: darwin, Python 3.7.4, pytest 5.0.1, pytest-sugar 0.9.2) rootdir: /Users/byeon/Dropbox/workspace/kyle-school/notebooks plugins: sugar-0.9.2, dash-1.0.0, mock-1.10.4 collecting ... ――――――――――――――――――――――――――――― test_is_working_day ―――――――――――――――――――――――――――――― def test_is_working_day(): > assert is_working_day(datetime.date(2020,7,5)) == False E NameError: name 'datetime' is not defined test_utils.py:6: NameError test_utils.py ⨯ 100% ██████████ Results (0.20s): 1 failed - test_utils.py:5 test_is_working_day
%%writefile test_utils.py
# test_utils.py를 아래 내용으로 overwrite합니다(-a 옵션 없이!)
import datetime
from utils import is_working_day
def test_is_working_day():
assert is_working_day(datetime.date(2020,7,5)) == False
assert is_working_day(datetime.date(2020,7,4)) == False
assert is_working_day(datetime.date(2020,7,6)) == True
Overwriting test_utils.py
!pytest test_utils.py
Test session starts (platform: darwin, Python 3.7.4, pytest 5.0.1, pytest-sugar 0.9.2) rootdir: /Users/byeon/Dropbox/workspace/kyle-school/notebooks plugins: sugar-0.9.2, dash-1.0.0, mock-1.10.4 collecting ... test_utils.py ✓ 100% ██████████ Results (0.03s): 1 passed
your_module.py를 만듭시다
def multiply_by_two(x):
return x * 2
tests/test_your_module.py도 만듭시다
from your_module import *
def test_multiply_by_two():
assert multiply_by_two(2) == 4
assert multiply_by_two(3.6) == 7.2
tests/__init__.py
빈 파일을 만들어주세요
pytest 실행
소스 코드에서 다음을 실행합니다
pytest tests/
성공!
직접 따라쳐봅시다
이번엔 tests/test_your_module.py에 다음과 같이 입력해볼게요(일부러 오류 발생)
2가지 모두 실패!
from your_module import *
def test_multiply_by_two():
assert multiply_by_two(2) == 5
assert multiply_by_two(3.6) == 7.9
하나의 함수만 지정해서 테스트하기
파일 지정하고 :: 뒤에 함수 작성
pytest tests/test_your_module.py::test_multiply_by_two
키워드 지정해서 테스트하기
-k
에 단어 지정
pytest tests/test_your_module.py -k multiply
Error가 발생하는지 Test하기
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError) as e:
3/0
class Queue:
def __init__(self):
self.items = []
def add_item(self, item):
self.items.append(item)
def first(self):
return self.items[0]
def last(self):
return self.items[-1]
def length(self):
return len(self.items)
from simple_class import Queue
def test_firstlast():
q = Queue()
q.add_item(5)
q.add_item(17)
q.add_item("hello")
assert q.first() == 5
assert q.last() == "hello"
def test_len():
q = Queue()
assert q.length() == 0
q.add_item(1)
assert q.length() == 1
for i in range(10):
q.add_item(i)
assert q.length() == 10
pytest test/
@pytest.fixture
데코레이터를 사용문법
@pytest.fixture(scope="fixture_scope")
def my_fixture():
return fixture_object
def test_sample_function(my_fixture):
# test code
utils.py
import pandas as pd
def load_data():
df = pd.read_csv("iris.csv")
return df
tests/test_utils.py
import pytest
import pandas as pd
from utils import load_data
@pytest.fixture(scope="session")
def result_fixture():
result = load_data()
return result
def test_len(result_fixture):
assert len(result_fixture) == 150
def test_object_type(result_fixture):
assert isinstance(result_fixture, pd.DataFrame)
@pytest.mark.parametrize()
파라미터로 넘겨서 여러가지를 한꺼번에 테스트할 경우 사용
import pytest
@pytest.mark.parametrize("test_input, expected",
[("3+5", 8),
("2+4", 6),
("6*9", 42)])
def test_eval(test_input, expected):
assert eval(test_input) == expected
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
# automatically raises ZeroDivisionError
return a * 1.0 / b
def maximum(a, b):
return a if a >= b else b
def minimum(a, b):
return a if a <= b else b
from calc_func import *
class Calculator(object):
def __init__(self):
self._last_answer = 0.0
@property
def last_answer(self):
return self._last_answer
def _do_math(self, a, b, func):
self._last_answer = func(a, b)
return self.last_answer
def add(self, a, b):
return self._do_math(a, b, add)
def subtract(self, a, b):
return self._do_math(a, b, subtract)
def multiply(self, a, b):
return self._do_math(a, b, multiply)
def divide(self, a, b):
return self._do_math(a, b, divide)
def maximum(self, a, b):
return self._do_math(a, b, maximum)
def minimum(self, a, b):
return self._do_math(a, b, minimum)