下面是一个在一个文件中使用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文件的方式)。但这不是我想要的。
这是为什么?我错误地拆分了这个文件吗?我错过了额外的代码或文件吗?
如果我错误地将其分开,最好的方法是什么?
感谢任何帮助,谢谢。
答案 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文件中。
希望这有帮助。