gpt4 book ai didi

python - 如何为 bin 目录中的脚本编写 Python 单元测试

转载 作者:太空狗 更新时间:2023-10-29 21:03:04 48 4
gpt4 key购买 nike

Python unittest 模块似乎假定一个项目的目录结构,其中有一个项目根级目录,其中包含源代码和测试。

不过,我想在我的 ~/bin 目录中编写 Python 脚本,并在另一个目录(例如,~/dev/tests)中对其进行测试。有没有一种方法可以让我使用命令行界面运行单元测试,而无需设置我的 PYTHONPATH 环境变量并创建 __init__.py 文件等等?

这里有一个简单的例子来展示我想要什么:

~/bin/candy:

#!/usr/bin/env python

def candy():
return "candy"

if __name__ == '__main__':
print candy()

~/dev/tests/test_candy.py:

#!/usr/bin/env python

import unittest
import candy

class CandyTestCase(unittest.TestCase):

def testCandy(self):
candyOutput = candy.candy()

assert candyOutput == "candy"

我注意到如果满足以下条件,一切都可以很方便地完成:

  • 这两个文件以 py 扩展名命名(candy.pytest_candy.py)
  • 两个文件在同一个目录下
  • 测试在测试目录中使用以下内容运行:$ python -m unittest test_candy

我可以使用 unittest 模块运行 python 来执行以下操作而无需在我的环境中明确设置任何内容吗:

  • 我的测试文件没有 py 扩展名(只是 ~/candy)。
  • 我不关心 test_candy 是否有 py 作为扩展名。
  • 我希望 candytest_candy.py 不共享一个公共(public)根目录(我的主目录除外)。

如果通过 python -m unittest 的简单调用无法做到这一点,那么最简单的方法是什么?

最佳答案

这是 candy 可执行文件(没有变化):

➜ cat ~/bin/candy

#!/usr/bin/env python
def candy():
return "candy"

if __name__ == '__main__':
print candy()

这是 ~/dev/tests/test_candy.py(已更改):

➜ cat ~/dev/tests/test_candy.py

#!/usr/bin/env python

import imp
import unittest

from os.path import expanduser, join

# use expanduser to locate its home dir and join bin and candy module paths
candy_module_path = join(expanduser("~"), "bin", "candy")

# load the module without .py extension
candy = imp.load_source("candy", candy_module_path)


class CandyTestCase(unittest.TestCase):

def testCandy(self):
candyOutput = candy.candy()

assert candyOutput == "candy"

发生了什么变化?

  • 我们添加了imp.load_source导入~/bin/candy(没有*.py扩展名的模块)

  • 我们添加了使用 expanduser

  • 定位主目录的规定,即 ~
  • 我们正在使用 os.path.join 加入 ~/bin/candy

    的路径

现在您可以使用 unittest 模块的 discover 选项运行测试。

查看 python -m unittest --help 了解更多详情。

摘录如下

-s directory 开始发现的目录('.'默认)

-p pattern 匹配测试文件的模式('test*.py'默认)

➜ python -m unittest discover -s ~/bin/ -p 'test*' -v ~/dev/tests
testCandy (test_candy.CandyTestCase) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

关于python - 如何为 bin 目录中的脚本编写 Python 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33469246/

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