Pytest 的仅收集 case 的妙用

在 Pytest 中,--co--collect-only 的缩写)和 -q 选项提供了一个强大而灵活的组合,用于仅收集测试用例而不运行它们,并且以简化的方式输出结果。让我们深入了解这两个选项的妙用以及它们在测试开发中的实际应用。

仅收集测试用例:--co

--co 选项是 Pytest 提供的一个有用工具,用于仅仅收集测试用例而不执行它们。通过运行以下命令:

pytest --co

此时可以在控制台中看到所有被 Pytest 发现的测试用例,但这些测试用例并不会真正运行。这使得此时能够快速查看项目中的所有测试,了解其结构和数量,而无需执行实际的测试代码。

输出的示例:

platform darwin -- Python 3.10.10, pytest-7.4.2, pluggy-1.3.0
rootdir: /Users/xxx/PycharmProjects/test_demo
plugins: allure-pytest-2.13.2
collected 50 items                                                                                                                                                                                       

<Module test_out_case.py>
  <Class TestOutCase>
    <Function test_assert_success>
  <Function test_out_class>
<Package test_pytest>
  <Module test_add_params.py>
    <Class TestAdd>
      <Function test_add1[int]>
      <Function test_add1[float]>
      <Function test_add1[int_float]>
      <Function test_add1[float_int]>
      <Function test_add4[98.99-99-197.99]>
      <Function test_add4[99-98.99-197.99]>
      <Function test_add4[-98.99--99--197.99]>
      <Function test_add4[-99--98.99--197.99]>
      <Function test_add4[99.01-0-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]>
      <Function test_add4[-99.01--1-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]>
      <Function test_add4[2-99.01-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]>
      <Function test_add4[1--99.01-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]>
      <Function test_add12[chinese]>
  <Module test_first.py>
    <Function test_inc>
    <Class TestFunction>
      <Function test_fuc1>
      <Function test_func2>
  <Module test_params.py>
    <Class TestParams>
      <Function test_search[python]>
      <Function test_search[selenium]>
      <Function test_search[java]>
      <Function test_search1>
      <Function test_mark_more[\u5c0f\u660e]>
      <Function test_mark_more[lily]>
      <Function test_mark_more[tom]>
      <Function test_param1[1-a]>
      <Function test_param1[1-b]>
      <Function test_param1[1-c]>
      <Function test_param1[2-a]>
      <Function test_param1[2-b]>
      <Function test_param1[2-c]>
      <Function test_param1[3-a]>
      <Function test_param1[3-b]>
      <Function test_param1[3-c]>
  <Module test_setup.py>
    <Function test_func1>
    <Function test_func2>
    <Class TestSetup>
      <Function test_demo1>
      <Function test_demo2>
  <Module test_student_manager.py>
    <Class TestStudentManager>
      <Function test_add>
      <Function test_remove>
      <Function test_get_student>
      <Function test_average_score>
  <Module test_student_manager_by_params.py>
    <Class TestStudentManager>
      <Function test_add[feier-90]>
      <Function test_add[\u5c0f\u660e-80]>
      <Function test_add[1346-99]>
      <Function test_add[*&^%$-100]>
      <Function test_add[lily-89.76]>
      <Function test_average_score[feier-90-\u5c0f\u660e-94-92]>
<Package test_it>
  <Module test_demo.py>
    <Function test_a>
    <Function test_b>

简化输出:-q

-q 选项用于简化控制台输出,将其减少为更为紧凑的形式。通过运行以下命令:

pytest -q

此时将只看到测试运行的结果,而不会被冗长的详细信息淹没。这对于大型测试套件和在 CI/CD 流程中执行测试时非常有用,能够保持输出的清晰和易读。

--co -q 的联合使用

--co-q 结合使用,可以获得一个仅收集测试用例并以简化形式输出的效果。通过运行以下命令:

pytest --co -q

输出的范例:

test_out_case.py::TestOutCase::test_assert_success
test_out_case.py::test_out_class
test_pytest/test_add_params.py::TestAdd::test_add1[int]
test_pytest/test_add_params.py::TestAdd::test_add1[float]
test_pytest/test_add_params.py::TestAdd::test_add1[int_float]
test_pytest/test_add_params.py::TestAdd::test_add1[float_int]
test_pytest/test_add_params.py::TestAdd::test_add4[98.99-99-197.99]
test_pytest/test_add_params.py::TestAdd::test_add4[99-98.99-197.99]
test_pytest/test_add_params.py::TestAdd::test_add4[-98.99--99--197.99]
test_pytest/test_add_params.py::TestAdd::test_add4[-99--98.99--197.99]
test_pytest/test_add_params.py::TestAdd::test_add4[99.01-0-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]
test_pytest/test_add_params.py::TestAdd::test_add4[-99.01--1-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]
test_pytest/test_add_params.py::TestAdd::test_add4[2-99.01-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]
test_pytest/test_add_params.py::TestAdd::test_add4[1--99.01-\u53c2\u6570\u5927\u5c0f\u8d85\u51fa\u8303\u56f4]
test_pytest/test_add_params.py::TestAdd::test_add12[chinese]
test_pytest/test_first.py::test_inc
test_pytest/test_first.py::TestFunction::test_fuc1
test_pytest/test_first.py::TestFunction::test_func2
test_pytest/test_params.py::TestParams::test_search[python]
test_pytest/test_params.py::TestParams::test_search[selenium]
test_pytest/test_params.py::TestParams::test_search[java]
test_pytest/test_params.py::TestParams::test_search1
test_pytest/test_params.py::TestParams::test_mark_more[\u5c0f\u660e]
test_pytest/test_params.py::TestParams::test_mark_more[lily]
test_pytest/test_params.py::TestParams::test_mark_more[tom]
test_pytest/test_params.py::TestParams::test_param1[1-a]
test_pytest/test_params.py::TestParams::test_param1[1-b]
test_pytest/test_params.py::TestParams::test_param1[1-c]
test_pytest/test_params.py::TestParams::test_param1[2-a]
test_pytest/test_params.py::TestParams::test_param1[2-b]
test_pytest/test_params.py::TestParams::test_param1[2-c]
test_pytest/test_params.py::TestParams::test_param1[3-a]
test_pytest/test_params.py::TestParams::test_param1[3-b]
test_pytest/test_params.py::TestParams::test_param1[3-c]
test_pytest/test_setup.py::test_func1
test_pytest/test_setup.py::test_func2
test_pytest/test_setup.py::TestSetup::test_demo1
test_pytest/test_setup.py::TestSetup::test_demo2
test_pytest/test_student_manager.py::TestStudentManager::test_add
test_pytest/test_student_manager.py::TestStudentManager::test_remove
test_pytest/test_student_manager.py::TestStudentManager::test_get_student
test_pytest/test_student_manager.py::TestStudentManager::test_average_score
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_add[feier-90]
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_add[\u5c0f\u660e-80]
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_add[1346-99]
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_add[*&^%$-100]
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_add[lily-89.76]
test_pytest/test_student_manager_by_params.py::TestStudentManager::test_average_score[feier-90-\u5c0f\u660e-94-92]
test_pytest/test_b/test_it/test_demo.py::test_a
test_pytest/test_b/test_it/test_demo.py::test_b

此时能够快速查看测试套件的结构,而不会受到冗余的输出干扰。这对于快速测试构建、调试和维护测试套件是非常有帮助的。

应用场景

  1. 快速测试探索: 使用 --co -q 可以帮助快速查看测试套件的全貌,尤其在初次接触项目或者需要理解整体测试结构时。
  2. 调试和开发阶段: 在测试用例开发和调试阶段,使用这两个选项可以帮助你更快地获得反馈,而不必执行整个测试套件。
  3. CI/CD 流程中的输出管理: 在持续集成和持续交付(CI/CD)流程中,通过简化输出,可以更轻松地集成测试结果到日志和报告中,加速问题定位和解决的速度。
  4. 测试平台开发: 在平台开发过程中,可以运用该命令快速获取测试用例的可被执行的node id 方便后续的运行操作

结语

--co -q 的组合为 Pytest 提供了一种高效的测试控制台管理方式。它使测试用例的收集变得更加便捷,同时简化了输出,提高了可读性。在测试开发和维护的过程中,这两个选项可以帮助你更高效地构建、调试和管理测试套件。