LoginSignup
24
37

More than 5 years have passed since last update.

自分の才能の無さに気が付いたら...pytestを試していた..

Last updated at Posted at 2019-02-21

この記事は.

テスト自動化のライブラリを使ってみたのでその手順をメモっておきます.(pytestというよりpythonそのものにはまった..)

テスト自動化を導入するまで

最近,javascript(vue),pythonなどでコードを書くけど,はやりバグはあり注意深くソースなどを見てコミットするようにはするがデグル..:bow_tone1:などをやっていると時間がもったいないので,テスト自動化を取り入れることにしました.

テスト自動化の歴史

こちらは,今後お勉強します.以下が大変ためになりました.
テスト自動化について、調べてみた

what is the pytest ???

公式より

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.

pythonのテストライブラリの1つです.標準にunittestがついてますが,コードが長いのでpytestを採用しました.
理由はそれだけなので,他も試して自分に合うものを採用しようと思います.

インストール

pytestをインストールします.その後にガバレッジを出してくれるプラグインもあるので追加しておきます.

pip install pytest
pip install pytest-cov

FizzBuzz

今回は使ってみたが目的なのでFizzBuzzで.

フォルダ構成は,srcフォルダは開発ソース,testファルダはテストソースを入れる.
テストファイル名はtest_を先頭に付けます.

Moduleフォルダ

  • main.py
  • srcフォルダ
    • __init__.py
    • FizzBuzz.py
  • testフォルダ
    • __init__.py
    • test_FizzBuzz.py

ソースは以下です.(python初心者なのでinitファイルとかこれで正しいかは正直よくわからないです.)
テスト失敗するために,if-elifの順番を間違ってます

__init__.py
from . import FizzBuzz
FizzBuzz.py
# 3の倍数なら「Fizz」,5の倍数なら「Buzz」,両方の倍数なら「FizzBuzz」
def FizzBuzz(number):
    if number % 5 == 0:
        say = 'Buzz'
    elif number % 3 == 0:
        say = 'Fizz'
    elif number % 15 == 0:
        say = 'FizzBuzz'
    else:
        say = str(number)

    return say

これで,バグを含んでいる状態でソースが完成です.

テストコード

今回はこれで終わりでなく,テストコードも書いて検証します.

検証は4種類かと思います.

  • 3の倍数のとき
  • 5の倍数のとき
  • 両方の倍数のとき
  • 上記以外のとき
テストコードの書き方
import src import file
def test_function():
    assert file.function(arg) == answer

以下がソースです.(initファイルでシステムパスをいじります.これが滅茶苦茶躓きました.実行ファイルより上のパスに行けないのね..:thinking:)
次にガバレッジを100%にしないため,Fizz,Buzz,FizzBuzz以外のテストをしません.

__init__.py
import sys, os
sys.path += [os.path.dirname(os.path.dirname(__file__))]
from src import FizzBuzz

def test_Fizz():
    assert FizzBuzz.FizzBuzz(3) == 'Fizz'
    assert FizzBuzz.FizzBuzz(297) == 'Fizz'

def test_Buzz():
    assert FizzBuzz.FizzBuzz(5) == 'Buzz'
    assert FizzBuzz.FizzBuzz(40) == 'Buzz'

def test_FizzBuzz():
    assert FizzBuzz.FizzBuzz(15) == 'FizzBuzz'
    assert FizzBuzz.FizzBuzz(150) == 'FizzBuzz'

テスト実行

コマンドラインからpytestでテストフォルダ内のテストファイルを実行してくれます.
(test_となっているファイルをテストファイルとみなしている)
image.png
無事,エラーになりました.
15を入れたのに'FizzBuzz'でなく'Buzz'が返ってきてます.if-elifの順番を入れ替えて再実行します.:triangular_flag_on_post:
image.png

ガバレッジ

テストコードは通りました.が,テストが書いたコード全てを網羅しているのか?テストが漏れていないのか?という問題があります.
そこで,pytest-covというプラグインを使います(事前インストール済み)
コマンドラインで以下を叩きます.

pytest --cov --cov-report=html

テストが終わると,module直下にhtmlcovというフォルダが生成されています.
中身はテスト結果であり,ガバレッジとその詳細を教えてくれます.(今回はその他の場合のテストがないのでそこがテストできてないです.)

image.png
image.png

まとめ

今回は,テスト自動化ということでpytestを試してみました.
テストコードをちゃんと書くことで,意識してソースを書くようになった.(と思う):smiley:
(天才でもやるべき!)

今後

他にも機能はたくさんあるのでどんどん試していきたいです.TDDの考え方などいろいろあるのでそちらもお勉強しようと思います.
テストコード書いてるから大丈夫だけど,テストコードが間違っている場合もあるのでそちらも注意しようと思うこの頃.

参考

公式doc
pytestのとりあえず知っておきたい使い方

24
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
37