2017-02-12 8 views
1

Вопроса о модульном тестировании

Цели: Цель состоит в том, чтобы использовать 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

В конце концов, я чувствую, что я просто не хватает что-то основное, даже после того, как много исследований. Это похоже на обычную установку, и я надеюсь, что кто-то скажет мне, что я делаю неправильно, и что это может помочь другим избежать этой проблемы в будущем.

ответ

0

Внутри файла testCalc.py добавьте следующее.

import sys 
import os 

sys.path.append(os.path.abspath('../calculatorAlgo')) 
from calculator import simpleCalc 
+0

Я добавил косую черту, которая отсутствовала. – benjamin

+0

не работает – Crystal

+0

Это сработало для меня! Спасибо @benjamin – jaybird4522