【问题标题】:Pytest - how to structure the tests efficientlyPytest - 如何有效地构建测试
【发布时间】:2023-02-07 18:23:17
【问题描述】:

假设有 2 个端点要测试。

端点 1 将需要在请求中使用的数据返回到端点 2。

如何有效地测试 2 个端点?

# file_1.py

def test_endpoint_1():
    r = requests.get(...)

    assert r.status_code == 200
    maybe some JSON Schema validation

    return r    
# file_2.py

from file_1 import test_endpoint_1

def test_endpoint_2():
    needed_data = test_endpoint_1()
    r = requests.get(..., payload=needed_data.json())

    assert r.status_code == 200
    maybe some JSON Schema validation

上面的方法有点管用,但如果我执行测试套件,我们将测试 endpoint_1 两次。我可以更改 test_endpoint_1() 的名称来避免这种情况,但也许有更简单、更优雅的方法?

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    访问 endpoint1 只是为端点 2 获取合适负载的方法。另一种是只提供硬编码的有效载荷。

    # file_2.py
    
    
    def test_endpoint_2():
        needed_data = {"foo": "bar"}  # Whatever is appropriate
    
        r = requests.get(..., payload=needed_data.json())
    
        assert r.status_code == 200
        maybe some JSON Schema validation
    

    【讨论】:

      【解决方案2】:

      硬编码值

      通常,我们“假设”依赖项正常工作。 在这种情况下,保持简单并在测试中创建一个硬编码值。

      # file_2.py
      
      def test_endpoint_2():
          needed_data = "JSON"  # valid return example from test_endpoint_1
          r = requests.get(..., payload=needed_data)
      
          assert r.status_code == 200
          maybe some JSON Schema validation
      

      pytest.夹具

      如果您在许多测试中需要此值,请改为创建一个夹具。这将允许您在一个地方编辑 endpoint_2 的“有效值”,而不是在依赖它的每个测试中更改它。

      我建议您将固定装置放在 conftest.py 文件中。这是解释here

      # conftest.py
      
      import pytest
      
      @pytest.fixture
      def endpoint_1_value_200():
          return "JSON"
      
      # file_2.py
      
      def test_endpoint_2(endpoint_1_value_200):
          r = requests.get(..., payload=endpoint_1_value_200)
      
          assert r.status_code == 200
          maybe some JSON Schema validation
      

      【讨论】:

        【解决方案3】:

        把它放在一个单独的函数中:

        def check_endpoint_1():
            r = requests.get(...)
        
            assert r.status_code == 200
            maybe some JSON Schema validation
        
            return r
        
        def test_endpoint_1():
            check_endpoint_1()
        
        def test_endpoint_2():
            needed_data = check_endpoint_1()
            r = requests.get(..., payload=needed_data.json())
        
            assert r.status_code == 200
            maybe some JSON Schema validation
        
        

        【讨论】:

          猜你喜欢
          • 2012-10-25
          • 1970-01-01
          • 2018-06-29
          • 2013-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 2021-12-21
          相关资源
          最近更新 更多