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

标签 python unit-testing python-unittest

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/

相关文章:

python - 我如何使用 spark-env.sh.template 在 Python 3 中设置 Pyspark

python - Python 3.8.3 hashlib中是否有针对该算法的Hash算法; Base64(SHA1(随机数 + 时间戳 + SHA1(密码)))?

python - 应用程序的每个实例都应该有自己的 cassandra session 还是应该共享同一个 session ?

javascript - Jasmine spyOn 在 AngularJS 指令上无法正常工作

python - 测试和模拟使用 async with 语句的异步代码

python - 一种模拟松散定义的 Python dict 对象的简单方法

python - 我可以使用 Selenium Python 在 Canvas 上绘图吗?

Python unittest - 在测试中使用模块和类级别设置函数中定义的变量

python - 使用 gspread python 在 Google Sheets 的最后一个填充行之后添加数据

c# - 测试类 - 何时重构?