Вопроса о модульном тестировании
Цели: Цель состоит в том, чтобы использовать pyUnit в testCalc.py для модульного тестирования объекта simpleCalc в calculator.py.
Проблема: Я не могу успешно импортировать объект simpleCalc из calculator.py в testCalc.py, когда testCalc запускается из отдельного каталога в проекте.
Фон: Единичный тест в testCalc.py работает отлично, когда он включен в тот же каталог, что и calculator.py, но когда я перехожу в отдельную папку и пытаюсь импортировать объект simpleCalc, определенный в calculator.py, Я получаю сообщение об ошибке. Я пытаюсь узнать, как использовать модуль тестирования модулей pyUnit в простом проекте, и я явно пропустил что-то общее о том, как импортировать модули для модульного тестирования в иерархической структуре каталогов. Основной проект calculator_test, описанный ниже, представляет собой простой проект, который я создал для практики. Вы можете видеть все сообщения, которые я прошел уже в конце этого сообщения.
Окончательный вопрос: Как импортировать объект simpleCalc в testCalc.py с иерархией каталогов, описанной ниже?Импортирующих модули правильно для модульного тестирования в Python с использованием pyunit
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.которые могли бы сделать относительный импорт.
# 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: Покушение относительного импорта за верхним уровень пакета
Других ресурсы
Здесь некоторые из сообщений, с которыми я работал безрезультатно:
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
В конце концов, я чувствую, что я просто не хватает что-то основное, даже после того, как много исследований. Это похоже на обычную установку, и я надеюсь, что кто-то скажет мне, что я делаю неправильно, и что это может помочь другим избежать этой проблемы в будущем.
Я добавил косую черту, которая отсутствовала. – benjamin
не работает – Crystal
Это сработало для меня! Спасибо @benjamin – jaybird4522