当前位置: 首页 > 知识库问答 >
问题:

测试装饰器与pytest使用奇怪的语法

扶冠宇
2023-03-14

所以我想测试一个装饰器,它给你一个准备好的协程(所以我不必做coroutine.send(无))。

详情可以在这里找到。大卫·比兹利的例子)

因此,在conftest.py中,我创建了一个函数包装器,它是一个pytest夹具,如果有意义的话,它将为我提供一个原始的协程。

我这样做的原因是因为pytest会把任何在收益关键字之后的东西作为拆卸代码,我不想这样。所以我自己包装了一个原始协程。

@pytest.fixture(scope="module")
def create_coroutine_func():

    def grep(pattern):
        print "Looking for %s" % pattern
        while True:
            line = (yield)
            if pattern in line:
                print line
    return grep

现在,在我的测试文件中,我有一个相当简单的测试:

    from something.decorators import *
    import pytest

1    def test_coroutine(create_coroutine_func):
2        coro_func = create_coroutine_func()
3        coro_wrapper = coroutine(coro_func)
4    
5        assert callable(coro_wrapper)

好了,就这样。pytest投诉:

create_coroutine()缺少1个必需的位置参数:“pattern”

然后我继续编辑第2行:

coro_func = create_coroutine_func("python") # match anything has 'python' in it.

现在测试通过了。

现在我有点搞不懂装修工了。

所以在我的例子grep需要一个参数;当我调用grep函数包装器时,我需要给函数包装器一个参数,尽管它本身不需要任何参数?这就是装修工的工作方式吗?

共有1个答案

徐涵亮
2023-03-14

UPD:正如@jacques kvam在评论中指出的,当您将一个fixture作为参数传递到测试函数中时,fixture的返回值就是参数的值。因此,在您的例子中,第2行create\u coroutine\u funcgrep

这种对pytest夹具的误解可能是错误使用测试函数本身中的值的主要原因。

一旦这一点清楚了,下面是我最初的答案:

在这里,您在第2行的create_coroutine_func()中调用函数。这就是为什么它期望传递参数。

如果要将函数包装到装饰器中,您实际需要的是对函数对象本身进行操作。它不调用它,而是将其作为值传递给装饰器:

def test_coroutine(create_coroutine_func):
    coro_wrapper = coroutine(create_coroutine_func)
    assert callable(coro_wrapper)
    coro_wrapper("python")

装饰器就是这样工作的:它们将一个函数作为参数,并返回另一个(或相同)函数作为结果。

附言:同样的测试可以用更好的语法编写:

from something.decorators import *
import pytest

def test_coroutine(create_coroutine_func):

    @coroutine
    def grep(pattern):
        print "Looking for %s" % pattern
        while True:
            line = (yield)
            if pattern in line:
                print line       

    assert callable(grep)
    grep("python")

注意,decorator的用法在测试内部。因此,如果出现任何错误,测试将正常失败,而不是pytest的模块导入(如果在模块级别声明修饰的函数,则会发生这种情况,您可能已经注意到)。

 类似资料:
  • 问题内容: 我通常对JOINS十分熟悉,但这是新的。 假设三个表(两个表的典型情况和第三个链接器表): (出于简化目的,我无法复制实际的结构,这不是我的代码。) 通常,要获得“谁在什么时候买了什么”的表格,我可以这样做: 但是我已经看到了这个: 这是什么?只是另一种语法,还是一种性能技巧? (它在SQLServer,FYI上,但是大概可以应用于其他…) 问题答案: 括号不会改变语义。子句的位置控制

  • 在unittest中,我可以在一个类中设置变量,然后这个类的方法可以选择它想要使用的任何变量... 所以在unittest中,很容易将一组测试放在一起,这些测试可以放在一个类下,然后为不同的方法使用许多不同的变量(varA和varB)。在pytest中,我在conftest.py中创建了一个fixture,而不是在unittest中创建了一个类,如下所示。。。 对于两个不同的函数,我在不同的文件中

  • 本文向大家介绍Python装饰器语法糖,包括了Python装饰器语法糖的使用技巧和注意事项,需要的朋友参考一下 Python装饰器语法糖代码示例 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对呐喊教程的支持。如果你想了解更多相关内容请查看下面相关链接

  • 我使用JMH对DOM解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 有人能解释为什么会这样吗?此外,百分位数和所有数字意味着什么?为什么在第三次迭代后它开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

  • 例如: 测试。xml 案例#1:当我运行下面的特性文件时,它会正常执行并行测试: 有些事。特色 案例#2:当我使用“场景大纲”执行相同的场景时,并行测试同时进行,即使并行测试配置是在TestNG xml文件中设置的。 something2.feature 有人知道为什么QMETRY框架会出现这种情况吗?

  • 问题 很长一段时间以来,我的印象是使用嵌套的