【问题标题】:How can I iterate over test_function in pytest for multiple values?如何在 pytest 中迭代 test_function 以获得多个值?
【发布时间】:2020-11-06 05:46:04
【问题描述】:

我想知道如何在 pytest 中迭代 test_funtion() 以获得不同的值? 例如。

list = ['ls','ps', 'df' ,'du'] #list of Linux commands
def test_method(self):
    for I in list:
       r=subprocess.check_output(I)
       if r:
          assert True
       else: 
          assert False

现在当我运行 pytest -k test_method 时, 它显示我只通过了一个测试用例。 但我希望所有 4 个案例都使用单个函数运行,并且需要在输出中传递 4 个测试用例。 我怎样才能实现它?

【问题讨论】:

  • 不要迭代函数,迭代函数内部的这个值。我的意思是,在测试函数内的列表的所有值上运行你的函数,虽然不是一个理想的事情
  • 好的,这样做我只获得了一个整体通过的测试用例,但我有多个值。那么在这种情况下是否有像 4 个测试用例一样的输出?
  • 你可以,但这不是你应该做的单元测试。您的单元测试应该相互排斥。如果您的测试的所有值都有其他含义,您应该为每个值编写单独的测试。
  • 对,但测试方法在所有 4 个测试用例中都很常见,所以我不想让它变得多余,不像它应该对多个命令使用单个函数。为同一个测试方法编写多个函数不是一个好主意。
  • 那你为什么要测试 4 种不同的输入?如果它很常见并且测试通过了一个输入,那么就没有必要为不同的输入测试相同的测试

标签: python linux integration-testing pytest python-unittest


【解决方案1】:

扩展@Nithin-Mohan 之前的回答

commands = ['ls','ps', 'df' ,'du'] #list of Linux commands
@pytest.mark.parametrize("cmds",commands)
def test_method(cmds):
   r=subprocess.check_output(cmds)
   if r:
      assert True
   else:
      assert False

这是作为 4 个独立测试运行的输出

 test_sflow.py::test_method[ls] PASSED [ 25%]                                                                                                                                                                                                          
 test_sflow.py::test_method[ps] PASSED [ 50%]                                                                                                                                                                                                         
 test_sflow.py::test_method[df] PASSED [ 75%]                                                                                                                                                                                                       
 test_sflow.py::test_method[du] PASSED [ 100%]

【讨论】:

    【解决方案2】:

    试试pytest parameterization

    它有多种类型。将值作为元组传递并作为参数传递给测试函数

    【讨论】:

    • 好的,如果我的函数是类函数呢?如何在类函数中使用参数化?
    • @DhavalMehta 然后装饰方法,而不是类。
    • 好的,我能得到一些线索吗?我不知道方法。 TIA。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多