Python-使用典型的测试目录结构运行unittest

发布于 2021-02-02 23:09:32

即使是一个简单的Python模块,最常见的目录结构似乎也是将单元测试分成各自的test目录:

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

例如,请参见此Python项目howto。

我的问题是,实际上运行测试的通常方法是什么?我怀疑这对除我以外的所有人来说都是显而易见的,但是你不能仅从python test_antigravity.pytest目录运行,import antigravity因为模块不在路径上,它将失败。

我知道我可以修改PYTHONPATH和其他与搜索路径有关的技巧,但我不敢相信这是最简单的方法-如果你是开发人员,那很好,但如果用户只是想检查测试结果,就不能期望用户使用通过。

另一种选择是将测试文件复制到另一个目录中,但是似乎有点愚蠢,并且错过了将它们放在一个单独目录中的意义。

那么,如果你刚刚将源代码下载到我的新项目中,将如何运行单元测试?我希望有一个答案可以对用户说:“要运行单元测试,请执行X。”

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    我认为最好的解决方案是使用unittest 命令行界面,该界面会将目录添加到,sys.path因此你不必(在TestLoader类中完成)。

    例如,对于这样的目录结构:

    new_project
    ├── antigravity.py
    └── test_antigravity.py
    

    你可以运行:

    $ cd new_project
    $ python -m unittest test_antigravity
    

    对于像你这样的目录结构:

    new_project
    ├── antigravity
    │   ├── __init__.py         # make it a package
    │   └── antigravity.py
    └── test
        ├── __init__.py         # also make test a package
        └── test_antigravity.py
    

    在test包内的测试模块中,你可以antigravity照常导入包及其模块:

    # import the package
    import antigravity
    
    # import the antigravity module
    from antigravity import antigravity
    
    # or an object inside the antigravity module
    from antigravity.antigravity import my_object
    

    运行一个测试模块:

    要运行单个测试模块,在这种情况下test_antigravity.py:

    $ cd new_project
    $ python -m unittest test.test_antigravity
    

    只需以导入模块的相同方式引用测试模块即可。

    运行单个测试用例或测试方法:

    你也可以运行一个TestCase或一个测试方法:

    $ python -m unittest test.test_antigravity.GravityTestCase
    $ python -m unittest test.test_antigravity.GravityTestCase.test_method
    

    运行所有测试:

    你还可以使用测试发现,它将为你发现并运行所有测试,它们必须是命名为模块或包的模块test*.py(可以通过-p, –pattern标记进行更改):

    $ cd new_project
    $ python -m unittest discover
    

    这将运行包中的所有test*.py模块test



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看