暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「Pytest」工具美眉之初学命令行

将咖啡转化为程序的工具人 2021-09-09
1254

通过一串问题来学习pytest.main(),也就是pytest框架的入口。

pytest.main()这个方法有两个入参:

  • args – 命令行参数的数组

  • plugins –可以自动注册的插件的数组


1)怎么跑一个testcase?

用pytest创建第一个简单的测试用例, test_sample.py中定义一个方法,并定义一个测试用例:

    def add(x):
    return x + 1


    def test_answer():
    assert add(3) == 5

    pytest自动化测试的运行可以通过pytest.main执行:

      pytest.main(["test_sample.py"])

      可以在命令行中看到简单的测试结果的信息。


      2)怎么跑多个testcase?

      定义了多个test_*命名方式的testcase文件:

      可以通过pytest.main(["目录"])的方式运行目录下所有的testcase:

        pytest.main(["/cases/module1/"])

        可以看到命令行一个简单的汇总,4条case失败,3条成功。


        3)怎么通过关键字匹配,只跑部分测试用例,部分跳过?

        例如:只想跑TestClass中test_one这个测试用例,其他的不想跑。

          class TestClass:
          def test_one(self):
          x = "this"
          assert "h" in x


          def test_two(self):
          x = "hello"
          assert hasattr(x, "check")

          可以通过-k命令行参数,跳过其他testcase的执行

             pytest -k "TestClass and not two"

             pytest.main(["cases/module1/test_sample.py::test_one"])

            4)如何查看测试用例执行报告?

            可以通过pytest-allure展示优美的report。

              pytest --alluredir=reports
              allure generate reports/ -o reports/html

              可以生成html的结果报告:

              5)怎么对失败的测试用例进行失败重跑?

                 pytest --reruns=5  #最多重跑次数

                可以看到失败的4个case,每个都重跑了5遍,一共重跑了20次。


                6)怎么并行去执行测试用例?

                一个case执行耗时5秒,那5个就是25秒,怎么可以让它们变快?

                  pytest -n 5 #(进程数)

                  可以看到原本串行执行的5个耗时10秒,但是创建了5个进程并行去执行,总时间减少到了2秒。


                  7)怎么有一条测试用例失败了就退出运行?

                    pytest -x


                    遇到第一条失败用例,则不再执行其他的case。


                    8)怎么自己定义一个命令行参数?

                    定义一个conftest.py的文件,pytest会自动识别该命名的文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在该package内有效,可有多个conftest.py。下面的例子里新增了一个命令行参数:--env

                      def pytest_addoption(parser):
                      parser.addoption(
                      "--env",
                      action="store",
                      default="test_env1",
                      help="env to setup before test functions",
                      )


                      @pytest.fixture
                      def env(pytestconfig):
                      return pytestconfig.getoption("--env")

                      test_env.py

                        def test_env(env):
                        assert env == "test_env1"

                        命令行输入:

                          pytest test_env.py --env=env2

                          获取到命令行传入的参数,作为testcase的参数。


                          总结一下:

                          • -s: 显示程序中的print/logging输出

                          • -v: 丰富信息模式, 输出更详细的用例执行信息

                          • -q: 安静模式, 不输出环境信息

                          • -k:关键字匹配,用and区分:匹配范围(文件名、类名、函数名)

                          • --reruns:设置case 失败重跑最大次数

                          • -x: 设置失败了立即返回,不继续执行,可用于调试

                          • -n: 设置并行执行的进程数

                          • 通过conftest.py 中pytest_addoption 方法新增命令行参数,并结合fixture使用

                          今天的分享就到这里,如果文章对你有帮助,记得点赞和转发哦~

                          文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论