python如何将测试文件从代码拆分到单独的目录中

时间:2016-06-13 15:56:28

标签: python unit-testing

下面是一个在一个文件中使用unittest完成TDD的fizzbuzz程序,我使用python fizzbuzz.py -v在命令行中运行它。

import unittest

class FizzBuzz():
    def fizz_buzz(self, number):
        if number % 3 == 0 and number % 5 == 0:
            return 'fizzbuzz'

        if number % 3 == 0:
            return 'fizz'

        if number % 5 == 0:
            return 'buzz'

        return str(number)

class FizzBuzzTests(unittest.TestCase):

    def setUp(self):
        self.fb = FizzBuzz()

    def test_one_gets_one(self):
        self.assertEqual('1', self.fb.fizz_buzz(1))

    def test_three_gets_fizz(self):
        self.assertEqual('fizz', self.fb.fizz_buzz(3))

    def test_five_gets_buzz(self):
        self.assertEqual('buzz', self.fb.fizz_buzz(5))

    def test_six_gets_fizz(self):
        self.assertEqual('fizz', self.fb.fizz_buzz(6))

    def test_fifteen_gets_fizzbuzz(self):
        self.assertEqual('fizzbuzz', self.fb.fizz_buzz(15))


if __name__ == '__main__':
    unittest.main()

我决定拆分文件,因为分开的测试会更好。

树结构

|-fizzbuzz
   |-app
     - __init__.py
     -fizzbuzz.py
   |-tests
     - __init__.py
     -test_fizzbuzz.py

我将文件分割如下(仅显示部分文件,一次测试并传递代码)

#fizzbuzz.py
class FizzBuzz():
    def fizz_buzz(self, number):
        return str(number)

#test_fizzbuzz.py
import unittest
from fizzbuzz import FizzBuzz

class FizzBuzzTests(unittest.TestCase):

    def setUp(self):
        self.fb = FizzBuzz()

    def test_one_gets_one(self):
        self.assertEqual('1', self.fb.fizz_buzz(1))


if __name__ == '__main__':
    unittest.main()

在fizzbuzz目录中,我运行应该通过python tests/test_fizzbuzz.py的测试。

但是当我评论return str(number)或删除它时,我仍然会通过。

如果我将self.assertEqual('1', self.fb.fizz_buzz(1))更改为self.assertEqual('12', self.fb.fizz_buzz(1)),它仍然会运行不存在的代码。

我删除了测试目录中的所有.pyc文件,现在出现ImportError: No module named fizzbuzz错误

如果我将fizzbuzz.py文件移动到测试文件夹并运行python tests/test_fizzbuzz.py测试通过(这就是我获取.pyc文件的方式)。但这不是我想要的。

这是为什么?我错误地拆分了这个文件吗?我错过了额外的代码或文件吗?

如果我错误地将其分开,最好的方法是什么?

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

它与python如何查找和执行代码有关。

Python使用sys.path查找模块/脚本/包。 当您运行python脚本时,它会将该脚本的目录附加到sys.path /etc/fizzbuzz/tests。这不会让python找到包含fizzbuzz的文件夹,因为它位于上面的目录中,而不是python所见。

最简单的答案是将fizzbuzz上方目录的文件路径添加到名为 PYTHONPATH 的环境变量中。如果环境变量不存在,您可以创建它,python会将其中的任何目录添加到sys.path。

完成此操作后,您需要调整一些事项。

test_fizzbuzz中的import语句需要更改

from fizzbuzz.app import fizzbuzz

并在创建fizzbuzz时更改

fizzbuzz.FizzBuzz()

或者您可以将导入更改为:

from fizzbuzz.app.fizzbuzz import FizzBuzz

你不需要改变其他任何东西。

最后,如果你想在测试文件夹中运行任何和所有测试,那么你可以运行

python -m unittest discover tests

来自fizzbuzz项目目录中的命令行,它应该在tests文件夹中找到并运行所有测试。这意味着你不需要

if name == '__main__':

在python文件中。

希望这有帮助。