LoginSignup
1
1

More than 5 years have passed since last update.

(初心者向け)Python3のunittestで軽くハマったので記事書く

Last updated at Posted at 2018-11-17

ググってやってみたけど、いろいろとハマりポイントあったので参考までに書きます
クラスがある場合、クラスがない場合それぞれのユニットテスト.

unittest : Pythonの標準テスト機構。
import unittest って書くだけで使える。

テストしたいファイル

calc.py :計算結果を返してくれるモジュール
say.py :聴衆が叫んでくれるモジュール

成功例(コピペすれば実行できます)

ファイル構成

python
┣ Actual(実際のコード)
┃   ┣ __init__.py ハマりポイント1で解説
┃   ┣ calc.py (クラスがないファイル)
┃   ┗ say.py  (クラスがあるファイル)
┗ Test(テストコード)
    ┣ __init__.py ハマりポイント1で解説
    ┗ testSayAndCalc.py (ほんとはファイルごとに分けるべき)

実際のファイル

__init__.py
#中身空でOK
calc.py
def hikizan(a,b):
    return a-b
say.py
class Hoge:
    def sayFoo(self):
        return "audience:Foo"
    def say(self,a,b):
        return "audience:" + a+b
testSayAndCalc.py
from unittest import TestCase
from Actual.say import Hoge

import os
import sys
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)
import Actual.calc

class unittest(TestCase):
    def test_say(self):
        self.assertEqual(Hoge.sayFoo(self), 'audience:Foo')
        #ココだけわざと間違えてるのでテストエラーになる予定
        self.assertEqual(Hoge.say(self,"Yo","Ho"),"audience:YooHo")

    def test_calc(self):
        self.assertEqual(Actual.calc.hikizan(4,3),1)

実行方法

terminal(コマンドプロンプト)
PS C:python> python -m unittest Test.testSayAndCalc

実行結果

terminal(コマンドプロンプト)
.F
======================================================================
FAIL: test_say (Test.testSayAndCalc.unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:python\Test\testSayAndCalc.py", line 14, in test_say
    self.assertEqual(Hoge.say(self,"Yo","Ho"),"audience:YooHo")
AssertionError: 'audience:YoHo' != 'audience:YooHo'
- audience:YoHo
+ audience:YooHo
?            +

無事、テストを走らせることができました。

ハマりポイント

ハマりポイント1: 別階層のモジュールimportができない

別階層のモジュールを読み込む場合、import元と先に
1. __init__.py を配置
2. import前に以下を書き込む

import os
import sys
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)
import Actual.calc(importしたいモジュールを親階層から書く) 

ハマりポイント2: いつものpython XXX.py では実行できない

いつものように実行するとエラーになります。
1. 親階層に行くファイル構成 の場合、pythonディレクトリ以下でコマンドを打つ必要があります
2. python -m unittest Test.testSayAndCalc でテスト実行する
Testディレクトリ内すべてのテストを実行したい場合は python -m unittest discover Test

クラスがうまくimportできない、とか、
Module 'unittest' has no 'main' member
Module 'unittest' has no 'Testcase' member
などいろいろエラーでたが、成功例(コピペすれば実行できます) をきちんとコピペすれば解消できるはず。

以上となります

1
1
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
1
1