44754


Python3.6.3

ディレクトリ構成  
sample_project  
┣ bin  
┃ ┣ __init__.py  
┃ ┣ class_BaseModule.py  
┃ ┣ class_module.py  
┃ ┗ main.py  
┣ test  
┃ ┣ __init__.py  
┃ ┗ test_class_module.py  
┗__init__.py

class_BaseModule.py

[code]

    class base:
        def __init__(self):
            pass
        def get_base(self):
            return 'base'
    
[/code]

class_module.py

[code]

    import class_BaseModule
    class class_sample:
        def __init__(self):
            pass
        def get_(self):
            cls = class_BaseModule.base()
            return cls.get_base()
    
[/code]

main.py

[code]

    import class_module
    cls = class_module.class_sample()
    print(cls.get_())
    
[/code]

test_class_module.py

[code]

    import unittest
    import sys
    sys.path.append('../')
    from bin.class_module import class_sample
    
    class Test_class_module(unittest.TestCase):
        def Test_get_(self):
            cls = class_sample()
            actual = cls.get_()
            self.assertequal('base',actual)
    
    if __name__ == '__main__':
        unittest.main()
    
[/code]

上記の条件でテストすると

> ModuleNotFoundError: No module named 'class_BaseModule'

とされてテスト時に読み込んでくれません。

bin\test_class_module.py

[code]

    import class_module
    class Test_class_module(unittest.TestCase):
    ....
    
[/code]

bin直下にテストモジュールを置く上記条件でテストするとテストが通ります。

テスト時にディレクトリが違う事で宣言したモジュールは読み込みますが明示的に宣言していないモジュールを読まない状態になっていると思います。  
今回のディレクトリ構成でclass_BaseModuleモジュールを読む場合ばどのようなコードになりますか？


CC BY-SA 4.0
2018-06-13T05:20:26.097
44740
2018-06-13T16:10:03.607
2018-06-13T05:30:12.413
19110
28931
question
python python3
python unittestしたときに別モジュールを読み込まない


`test_class_module.py`の`sys.path.append('../')`の箇所で、読み込みたいモジュールは`bin`なので、sys.pathに追加する必要があるディレクトリは'../bin'になります。また、`sys.path.append`は、相対パスでの指定はできません。

それで、絶対パスで`'../bin'`ディレクトリを`sys.path`に追加するか

[code]

    sys.path.append('/path_to_sample_project/sample_project/bin')
    
[/code]

次のようにして、`'../bin'`ディレクトリの絶対パスを計算してから`sys.path`に追加するようにします。

[code]

    import sys, os
    path = os.path.join(os.path.dirname(__file__), '../bin')
    sys.path.append(path)
    
[/code]

英語版には、よく似た質問 [Running unittest with typical test directory
structure](https://stackoverflow.com/questions/1896918) があるので、参考にしてください。


CC BY-SA 4.0
2018-06-13T16:10:03.607
44754
2018-06-13T16:10:03.607
15171
44740
answer