オンラインドキュメント
https://pypi.org/project/pytest/
https://docs.pytest.org/en/stable/
https://docs.pytest.org/en/stable/getting-started.html
インストール
使い方
基本
成功するテストと、失敗するテストを説明する。
成功するテストとして、以下のような内容の test_sample1.py を作成する。
def test_passing_sample1() : | assert(1, 2, 3) == (1, 2, 3) |
|
失敗するテストとして、以下のような内容の test_sample2.py を作成する。
def test_failing_sample1() : | assert(1, 2, 3) == (3, 2, 1) |
|
コマンドプロンプトで pytest test_sample1.py test_sample2.py を実行する。以下のような内容の結果が表示される。成功したテストには . (ピリオド) 、失敗したテストには F が表示される。
============================= test session starts ============================= | platform win32 -- Python 3.9.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 |
rootdir: C:\Users\eagle_eight\py39\samples |
collected 2 items |
|
test_sample1.py . [ 50%] |
test_sample2.py F [100%] |
|
================================== FAILURES =================================== |
____________________________ test_failing_sample1 _____________________________ |
|
def test_failing_sample1() : |
> assert(1, 2, 3) == (3, 2, 1) |
E assert (1, 2, 3) == (3, 2, 1) |
E At index 0 diff: 1 != 3 |
E Use -v to get the full diff |
|
test_sample2.py:2: AssertionError |
=========================== short test summary info =========================== |
FAILED test_sample2.py::test_failing_sample1 - assert (1, 2, 3) == (3, 2, 1) |
========================= 1 failed, 1 passed in 0.10s ========================= |
|
1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
|
formのテキスト
selenium を使用した成功するテストとして、以下のような内容の test_sample3.py を作成する。
from selenium import webdriver | from selenium.webdriver.common.keys import Keys |
import time |
|
def test_passing_sample2() : |
browser = webdriver.Firefox() |
browser.get("http://localhost:8888/input/") |
|
elem1 = browser.find_element_by_name("input_text") |
if elem1 : |
elem1.send_keys("今日は何曜日?" + Keys.RETURN) |
|
time.sleep(5) |
elem2 = browser.find_element_by_name("input_text_result") |
|
result_text = "" |
if elem2 : |
result_text = elem2.text |
|
browser.quit() |
|
assert result_text == "今日は何曜日?" |
|
1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
|
コマンドプロンプトで Tornado の tornado_form.py を実行する。
別のコマンドプロンプトで pytest test_sample3.py を実行する。以下のような内容の結果が表示される。
============================= test session starts ============================= | platform win32 -- Python 3.9.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 |
rootdir: C:\Users\eagle_eight\py39\samples |
collected 1 item |
|
test_sample3.py . [100%] |
|
============================= 1 passed in 10.44s ============================== |
|
テスト駆動開発
文字列の分割関数のテスト駆動開発での実装について説明する。
以下のような内容の str_split_sample.py を作成する。
関数の内容は記述せず、成功すべきテスト関数を記述する。
def get_search_word_list(search_word) : | search_word_list = [] |
|
return search_word_list |
|
|
def test_passing_sample1() : |
assert get_search_word_list("'backup platinum' tmpgenc") == ['backup platinum', 'tmpgenc'] |
|
def test_passing_sample2() : |
assert get_search_word_list("tmpgenc 'backup platinum'") == ['tmpgenc', 'backup platinum'] |
|
def test_passing_sample3() : |
assert get_search_word_list("paragon tmpgenc 'backup platinum'") == ['paragon', 'tmpgenc', 'backup platinum'] |
|
def test_passing_sample4() : |
assert get_search_word_list("'backup platinum' tmpgenc 'WinDVD Pro'") == ['backup platinum', 'tmpgenc', 'WinDVD Pro'] |
|
def test_passing_sample5() : |
assert get_search_word_list("'backup platinum' paragon tmpgenc 'WinDVD Pro'") == ['backup platinum', 'paragon', 'tmpgenc', 'WinDVD Pro'] |
|
def test_passing_sample6() : |
assert get_search_word_list("backup platinum tmpgenc WinDVD Pro") == ['backup', 'platinum', 'tmpgenc', 'WinDVD', 'Pro'] |
|
def test_passing_sample7() : |
assert get_search_word_list("backup") == ['backup'] |
|
1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
|
コマンドプロンプトで pytest str_split_sample.py を実行する。以下のような内容の結果が表示される。
============================= test session starts ============================= | platform win32 -- Python 3.9.4, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 |
rootdir: C:\Users\eagle_eight\py39\samples |
collected 7 items |
|
str_split_sample2a.py FFFFFFF [100%] |
|
================================== FAILURES =================================== |
|
ここから、すべてのテストが成功するようになるまでコードを実装していく。
すべてのテストが成功するようになるコード str_split_sample.py は以下のようになる。
def get_search_word_list(search_word) : | search_word_list = search_word.split("'") |
if len(search_word_list) > 1 : |
while True: |
if "" in search_word_list : |
search_word_list.remove("") |
else : |
break |
|
for cnt in range(len(search_word_list)) : |
if search_word_list[cnt].startswith(" ") : |
wd_list =search_word_list[cnt].split(" ") |
while True : |
if "" in wd_list : |
wd_list.remove("") |
else : |
break; |
|
for ct in range(len(wd_list)) : |
if ct == 0 : |
search_word_list[cnt] = wd_list[0] |
else : |
search_word_list.insert(cnt+ct, wd_list[ct]) |
elif search_word_list[cnt].endswith(" ") : |
wd_list =search_word_list[cnt].split(" ") |
while True : |
if "" in wd_list : |
wd_list.remove("") |
else : |
break; |
|
for ct in range(len(wd_list)) : |
if ct == 0 : |
search_word_list[cnt] = wd_list[0] |
else : |
search_word_list.insert(cnt+ct, wd_list[ct]) |
|
else : |
search_word_list = search_word.split(" ") |
|
return search_word_list |
|
|
def test_passing_sample1() : |
assert get_search_word_list("'backup platinum' tmpgenc") == ['backup platinum', 'tmpgenc'] |
|
def test_passing_sample2() : |
assert get_search_word_list("tmpgenc 'backup platinum'") == ['tmpgenc', 'backup platinum'] |
|
def test_passing_sample3() : |
assert get_search_word_list("paragon tmpgenc 'backup platinum'") == ['paragon', 'tmpgenc', 'backup platinum'] |
|
def test_passing_sample4() : |
assert get_search_word_list("'backup platinum' tmpgenc 'WinDVD Pro'") == ['backup platinum', 'tmpgenc', 'WinDVD Pro'] |
|
def test_passing_sample5() : |
assert get_search_word_list("'backup platinum' paragon tmpgenc 'WinDVD Pro'") == ['backup platinum', 'paragon', 'tmpgenc', 'WinDVD Pro'] |
|
def test_passing_sample6() : |
assert get_search_word_list("backup platinum tmpgenc WinDVD Pro") == ['backup', 'platinum', 'tmpgenc', 'WinDVD', 'Pro'] |
|
def test_passing_sample7() : |
assert get_search_word_list("backup") == ['backup'] |
|
1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
|
コマンドプロンプトで pytest str_split_sample.py を実行する。以下のような内容の結果が表示される。
============================= test session starts ============================= | platform win32 -- Python 3.9.4, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 |
rootdir: C:\Users\eagle_eight\py39\samples |
collected 7 items |
|
str_split_sample.py ....... [100%] |
|
============================== 7 passed in 0.03s ============================== |
|