目标:目标是在testCalc.py中使用pyUnit对calculator.py中的simpleCalc对象进行单元测试。
问题:当从项目中的单独目录运行testCalc时,我无法将calculator.py中的simpleCalc对象成功导入testCalc.py。
背景:testCalc.py中的单元测试在与calculator.py包含在同一目录中时运行完全正常,但当我将其移动到单独的文件夹并尝试导入simpleCalc时在calculator.py中定义的对象,我收到一个错误。我正在尝试学习如何在一个简单的项目中使用pyUnit单元测试框架,并且我明显缺少关于如何在分层目录结构中导入单元测试模块的基本知识。下面描述的基本calculator_test项目是我创建的一个简单项目。您可以在本文末尾看到我已经完成的所有帖子
终极问题:如何将simpleCalc对象导入testCalc.py并使用下面描述的目录层次结构?
Github:https://github.com/jaybird4522/calculator_test/tree/unit_test
这是我的目录结构:
calculator_test/
calculatorAlgo/
__init__.py
calculator.py
test_calculatorAlgo/
__init__.py
testCalc.py
testlib/
__init__.py
testcase.py
这里是calculator.py文件,它描述了我想要进行单元测试的simpleCalc对象:
# calculator.py
class simpleCalc(object):
def __init__(self):
self.input1 = 0
self.input2 = 0
def set(self, in1, in2):
self.input1 = in1
self.input2 = in2
def subtract(self, in1, in2):
self.set(in1, in2)
result = self.input1 - self.input2
return result
这是testCalc.py文件,其中包含单元测试:
# testCalc.py
import unittest
from calculatorAlgo.calculator import simpleCalc
class testCalc(unittest.TestCase):
# set up the tests by instantiating a simpleCalc object as calc
def setUp(self):
self.calc = simpleCalc()
def runTest(self):
self.assertEqual(self.calc.subtract(7,3),4)
if __name__ == '__main__':
unittest.main()
我一直使用简单的命令运行单元测试文件:
testCalc.py
首次尝试
我尝试简单地根据它在目录结构中的位置导入simpleCalc对象:
# testCalc.py
import unittest
from .calculatorAlgo.calculator import simpleCalc
class testCalc(unittest....
得到了这个错误:
ValueError:在非包中尝试相对导入
第二次尝试
我试着在没有相对引用的情况下导入它:
# testCalc.py
import unittest
import simpleCalc
class testCalc(unittest....
得到了这个错误:
ImportError:没有名为simpleCalc
第三次尝试
基于这篇文章http://blog.aaronboman.com/programming/testing/2016/02/11/how-to-write-tests-in-python-project-structure/,我尝试创建一个名为testcase.py的独立基类,它可以进行相对导入。
# testcase.py
from unittest import TestCase
from ...calculator import simpleCalc
class BaseTestCase(TestCase):
pass
并在testCalc.py
中更改了我的导入# testCalc.py
import unittest
from testlib.testcase import BaseTestCase
class testCalc(unittest....
得到了这个错误:
ValueError:尝试相对导入超出toplevel包
其他资源
以下是我所做的一些无效的帖子:
Import a module from a relative path
python packaging for relative imports
How to fix "Attempted relative import in non-package" even with __init__.py
Python importing works from one folder but not another
Relative imports for the billionth time
最终,即使经过大量研究,我觉得我只是遗漏了一些基本的东西。这感觉就像一个常见的设置,我希望有人可以告诉我我做错了什么,以及它可能会帮助其他人在将来避免这个问题。
答案 0 :(得分:-1)
在testCalc.py文件中,添加以下内容。
import sys
import os
sys.path.append(os.path.abspath('../calculatorAlgo'))
from calculator import simpleCalc