2016-10-26 4 views
1

は、私はこのようなテストファイル記述する必要があります。ユニットテストでライブラリをインポートする場所は? Pythonの

import unittest 

from mylibrary import some_crazy_func 

class TestSomething(unittest.TestCase): 
    def test_some_crazy_func_that_needs_io_open(self): 
     # Opens file 
     # Calls function 
     # assert outputs 

をしかし、私は(のはioを言わせて)ライブラリをインポートする必要があり、「神託の場所は」ここで私はわかりませんよ。

それが一番上にあるべきである:

import io 
import unittest 

from mylibrary import some_crazy_func 

class TestSomething(unittest.TestCase): 
    def test_some_crazy_func_that_needs_io_open(self): 
     expected = ['abc', 'def', 'xyz'] 
     with io.open('somestaticfile.txt', 'r') as fin: 
      outputs = [some_crazy_func(line) for line in fin] 
     assert outputs == expected 

それともTestCaseの関数内:

import unittest 

from mylibrary import some_crazy_func 

class TestSomething(unittest.TestCase): 
    def test_some_crazy_func_that_needs_io_open(self): 
     import io 
     expected = ['abc', 'def', 'xyz'] 
     with io.open('somestaticfile.txt', 'r') as fin: 
      outputs = [some_crazy_func(line) for line in fin] 
     assert outputs == expected 

それともテストケース関数の前とオブジェクトの初期化である:

import unittest 

from mylibrary import some_crazy_func 

class TestSomething(unittest.TestCase): 
    import io 
    def test_some_crazy_func_that_needs_io_open(self): 
     expected = ['abc', 'def', 'xyz'] 
     with io.open('somestaticfile.txt', 'r') as fin: 
      outputs = [some_crazy_func(line) for line in fin] 
     assert outputs == expected 
+0

私はこれが最善の方法だとは言えませんが、何年も前に似たような質問をしましたが、これはどうやって単体テストのためのインポートを行ったのですかhttp://stackoverflow.com/questions/34689852/is-this- a-proper-way-to-test-stdout-with-python-3-unittest – tsumnia

+0

つまり、インポートが特定のテストケースに依存している場合、importlibは使用するルートかもしれません – tsumnia

答えて

0

PEP8:https://www.python.org/dev/peps/pep-0008/#id23

それは述べ、

輸入は常にちょうど任意のモジュールのコメントやdocstringの後、およびモジュールグローバルや定数の前に、ファイルの先頭に置かれます。

+0

unittestでもですか?テストが巨大であれば 'sys.path'がどのようにロードされるのか想像してみてください。 – alvas

+0

私はいつもこのPEP8ガイドラインの根拠を疑問に思っていました。少なくともあなたの例では、テストモジュールは機能モジュールから分離されています。ファイルの上やそれ以外の場所に置いても問題ありません。 –

関連する問題