pytest

オンラインドキュメント

https://pypi.org/project/pytest/

https://docs.pytest.org/en/stable/

https://docs.pytest.org/en/stable/getting-started.html

インストール

pip install pytest
1

使い方

基本

成功するテストと、失敗するテストを説明する。

成功するテストとして、以下のような内容の test_sample1.py を作成する。

def test_passing_sample1() :
    assert(1, 2, 3) == (1, 2, 3)
1
2

失敗するテストとして、以下のような内容の test_sample2.py を作成する。

def test_failing_sample1() :
    assert(1, 2, 3) == (3, 2, 1)
1
2

コマンドプロンプトで 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 を実行する。

> python tornado_form.py
1

別のコマンドプロンプトで 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 ==============================
1
2
3
4
5
6
7
8

テスト駆動開発

文字列の分割関数のテスト駆動開発での実装について説明する。

以下のような内容の 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 ===================================
1
2
3
4
5
6
7
8

ここから、すべてのテストが成功するようになるまでコードを実装していく。

すべてのテストが成功するようになるコード 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 ==============================
1
2
3
4
5
6
7
8