gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:54 26 4
gpt4 key购买 nike

下面是一个在一个文件中使用 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 文件的方式).但这不是我想要的。

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

如果我错误地拆分了它,最好的方法是什么?

感谢任何帮助,谢谢。

最佳答案

它与 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.FizzBuzz()

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

from fizzbuzz.app.fizzbuzz import FizzBuzz

而且您不需要更改任何其他内容。

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

python -m unittest discover tests

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

if name == '__main__':

在 python 文件中。

希望这对您有所帮助。

关于python如何将代码中的测试文件拆分到单独的目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com