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

python如何将测试文件从代码分割到单独的目录中,python,unit-testing,Python,Unit Testing,下面是一个fizzbuzz程序,在一个文件中使用unittest通过TDD完成,我在命令行中使用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:

下面是一个fizzbuzz程序,在一个文件中使用unittest通过TDD完成,我在命令行中使用
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目录中,我使用
python tests/test_fizzbuzz.py
运行测试,测试应该通过

但是当我注释掉
return str(number)
或删除它时,我仍然通过

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

我删除了test目录中的所有
.pyc
文件,现在我得到了
ImportError:没有名为fizzbuzz的模块
错误

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

为什么会这样?我把这个文件分错了吗?我是否缺少额外的代码或文件

如果我把它分错了,最好的办法是什么


感谢您的帮助。

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

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

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

一旦这样做了,你将需要调整一些事情

test_fizzbuzz中的导入语句需要更改

from fizzbuzz.app import fizzbuzz
并在创建气泡嗡嗡声时进行更改

fizzbuzz.FizzBuzz()
或者,您可以将导入更改为:

from fizzbuzz.app.fizzbuzz import FizzBuzz
你不需要改变其他任何事情

最后,如果要运行tests文件夹中的任何和所有测试,则可以运行

python -m unittest discover tests
从fizzbuzz项目目录中的命令行,它应该查找并运行tests文件夹中的所有测试。这意味着你不需要

if name == '__main__':
在python文件中


希望这有帮助。

fizzbuzz.py
需要在你的
PYTHONPATH上。但是您使用
\uuuu init\uuuuuuuupy
表明您想要使用软件包,在这种情况下,
app
需要在您的
PYTHONPATH
中,您应该导入
app.fizzbuzz
,谢谢您设法解决了这个问题。只是用了一次又一次的测试来运行测试,一切都正常。
python -m unittest discover tests
if name == '__main__':