控制使用pytest运行哪些测试

时间:2017-01-25 13:58:05

标签: python unit-testing pytest

我正在考虑将一些 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{code}/{culture}/{controller}/{action}/{id}", defaults: new {code ="efs",culture="fr-ca", controller = "Home", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute("Error", "{*url}", new { controller = "Error", action = "Error" }); } } 测试转换为Pytest测试以利用Pytest的灯具。然而,unittest.TestCase的一个功能是我无法轻易找到Pytest中的等价物,它是创建测试套件并运行它们的能力。我目前经常做这样的事情:

unittest

通过使用import unittest class TestSomething(unittest.TestCase): def test_1(self): self.assertEqual("hello".upper(), "HELLO") def test_2(self): self.assertEqual(1+1, 2) if __name__ == "__main__": suite = unittest.TestSuite() # suite.addTest(TestSomething('test_1')) suite.addTest(TestSomething('test_2')) runner = unittest.TextTestRunner() runner.run(suite) 注释和注释,我可以轻松选择要运行的测试。我如何用Pytest做类似的事情?

5 个答案:

答案 0 :(得分:2)

您可以使用-k参数来运行特定测试。例如

# put this in test.py
import unittest

class TestSomething(unittest.TestCase):
    def test_1(self):
        self.assertEqual("hello".upper(), "HELLO")

    def test_2(self):
        self.assertEqual(1+1, 2)

在类TestSomething中运行所有测试可以这样完成:

py.test test.py -k TestSomething

仅运行test_2

py.test test.py -k "TestSomething and test_2"

documentation

中的更多示例

答案 1 :(得分:2)

另一种方法是使用特殊的测试名称。这些可以在pytest.ini文件中进行配置。

# content of pytest.ini
# can also be defined in tox.ini or setup.cfg file, although the section
# name in setup.cfg files should be "tool:pytest"
[pytest]
python_files=check_*.py
python_classes=Check
python_functions=*_check

另一种方法是在conftest.py中采取行动。在此示例中,使用了collect_ignore配置变量。它是要忽略的测试路径列表。在此示例中,始终忽略test_somthing.py以进行收集。如果我们使用python 3进行测试,则忽略test_other_module_py2.py。

# content of conftest.py
import sys

collect_ignore = ["test_something/test_something.py"]
if sys.version_info[0] > 2:
    collect_ignore.append("test_other/test_other_module_py2.py")

这些是从pytest章节Changing standard (Python) test discovery

的文档中略有提取的

跳转pytest。真是太好了。

答案 2 :(得分:1)

除了使用-k过滤器之外,您还可以命名要运行的特定测试类或案例,

py.test test.py::TestSomething::test_2

只运行test_2

答案 3 :(得分:1)

认为最好的方法是使用自定义pytest标记。 您应该使用标记特定测试(您要运行的测试) @pytest.mark.mymarkername

使用命令使用自定义标记仅运行测试: py.test -v -m mymarkername

在这里您可以找到有关标记的更多信息: http://doc.pytest.org/en/latest/example/markers.html

答案 4 :(得分:0)

基于mbatchkarov的答案,由于我的测试名称可能会非常冗长,我希望仍然能够通过评论进出线并点击"来选择测试。 CNTRL + B"在Sublime(或" Cntrl + R"使用Atom Runner)。一种方法如下:

import unittest
import pytest

class TestSomething(unittest.TestCase):
    def test_1(self):
        self.assertEqual("hello".upper(), "HELLO")

    def test_2(self):
        self.assertEqual(1+1, 2)

if __name__ == "__main__":
    tests_to_run = []
#   tests_to_run.append('TestSomething and test_1')
    tests_to_run.append('TestSomething and test_2')
    tests_to_run = " or ".join(tests_to_run)
    args = [__file__, '-k', tests_to_run]
    pytest.main(args)

这背后的想法是因为Pytest接受一个字符串表达式来匹配测试(而不仅仅是一个测试列表),所以必须生成一个仅匹配一个测试的表达式列表,并使用or连接它们。