标签: pytest

Pytest:取消选择测试

使用pytest,可以使用装饰器标记测试

@pytest.mark.slow
def some_slow_test():
    pass
Run Code Online (Sandbox Code Playgroud)

然后,从命令行,可以告诉pytest跳过标记为"慢"的测试

pytest -k-slow
Run Code Online (Sandbox Code Playgroud)

如果我有一个额外的标签:

@pytest.mark.long
def some_long_test()
    pass
Run Code Online (Sandbox Code Playgroud)

我希望能够跳过长期和慢速测试.我试过这个:

pytest -k-slow -k-long
Run Code Online (Sandbox Code Playgroud)

还有这个:

pytest -k-slow,long
Run Code Online (Sandbox Code Playgroud)

似乎都不起作用.

在命令行中,如何告诉pytest跳过慢和长测试?

python pytest

43
推荐指数
3
解决办法
1万
查看次数

如果定义了构造函数,py.test将跳过测试类

我有跟随通过py.test运行的unittest代码.仅运行构造函数会在运行py.test -v -s时跳过整个类

收集0件/ 1跳过

任何人都可以向我解释py.test的这种行为吗?

我有兴趣了解py.test行为,我知道不需要构造函数.

谢谢,Zdenek

class TestClassName(object):
    def __init__(self):
       pass

    def setup_method(self, method):
       print "setup_method called"

    def teardown_method(self, method):
       print "teardown_method called"

    def test_a(self):
       print "test_a called"
       assert 1 == 1

    def test_b(self):
       print "test_b called"
       assert 1 == 1
Run Code Online (Sandbox Code Playgroud)

python pytest

43
推荐指数
2
解决办法
2万
查看次数

将py.test与coverage一起使用不包括导入

对于Jedi,我们想要生成我们的测试覆盖率.stackoverflow中有一个相关的问题,但它没有帮助.

我们使用py.test作为测试运行器.但是,我们无法将导入和其他"导入"内容添加到报表中.例如__init__.py,始终报告为未被发现:

Name                           Stmts   Miss  Cover
--------------------------------------------------
jedi/__init__                      5      5     0%
[..]
Run Code Online (Sandbox Code Playgroud)

显然,此文件正在导入,因此应报告为已测试.

我们开始这样的测试[*]:

py.test --cov jedi
Run Code Online (Sandbox Code Playgroud)

如你所见,我们正在使用pytest-coverage.

那么如何正确计算文件的覆盖范围__init__.py呢?

[*]我们还尝试在没有--doctest-modules(从中删除pytest.ini)的情况下启动测试并在之前激活覆盖模块py.test -p pytest_cov --cov jedi.它们都不起作用.

我提供了赏金.请尝试在Jedi内修复它.它是公开的.

python coverage.py pytest

42
推荐指数
3
解决办法
2万
查看次数

确保py.test包含sys.path中的应用程序目录

我有一个项目目录结构如下(我认为这很标准):

my_project
    setup.py
    mypkg
        __init__.py
        foo.py
    tests
        functional
            test_f1.py
        unit
            test_u1.py
Run Code Online (Sandbox Code Playgroud)

我正在使用py.test作为我的测试框架,我希望能够py.test testsmy_project目录中运行以运行我的测试.这确实有效,直到我尝试import mypkg在测试中使用(例如)导入我的应用程序代码.那时,我收到错误"没有名为mypkg的模块".在进行一些调查时,似乎py.test运行测试与测试文件的目录sys.path,但不是py.test运行的目录.

为了解决这个问题,我conftest.py在我的tests目录中添加了一个文件,其中包含以下代码:

import sys, os

# Make sure that the application source directory (this directory's parent) is
# on sys.path.

here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, here)
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但它是确保测试看到应用程序代码的好方法吗?有没有更好的方法来实现这一点,或者我在如何构建项目时做错了什么?

我已经看过其他一些使用的项目py.test(例如,pip但是我看不到代码做了这样的事情,但是运行py.test tests似乎在那里工作.我不知道为什么,但我担心他们可能以更简单的方式取得了同样的结果.

我查看了py.test文档,但是我看不出这个问题的解释或建议的方法来处理它.

python unit-testing pytest

42
推荐指数
4
解决办法
1万
查看次数

Pytest和Python 3

我在Debian Linux下安装了pytest 2.3.4.默认情况下,它在Python 2.7下运行,但有时我想在Python 3.x下运行它,它也是安装的.我似乎无法找到关于如何做到这一点的任何指示.

PyPI Trove分类器显示Python :: 3,因此可能必须是可能的.除此之外py.test somedir/sometest.py,我可以使用python -m pytest ...,甚至python2.7 -m pytest ...,但如果我尝试,python3 -m pytest ...我会得到

/usr/bin/python3: No module named pytest

pytest

41
推荐指数
4
解决办法
4万
查看次数

TypeError:attrib()获得了意外的关键字参数“转换”

在使用CI对CI服务器上的python项目进行自动化测试期间,发生了此错误pytest。我正在使用pytest==4.0.2。这个错误才刚刚开始发生,以前的管道似乎工作正常。

完整错误:

File "/usr/local/lib/python3.7/site-packages/_pytest/tmpdir.py", line 35, in TempPathFactory
    lambda p: Path(os.path.abspath(six.text_type(p)))
TypeError: attrib() got an unexpected keyword argument 'convert'
Run Code Online (Sandbox Code Playgroud)

python pytest

41
推荐指数
4
解决办法
5278
查看次数

unittest vs pytest

在unittest中,我可以在类中设置变量,然后这个类的方法可以选择它想要使用的任何变量......

class test_class(unittest.TestCase):
    def setUp(self):        
        self.varA = 1
        self.varB = 2
        self.varC = 3
        self.modified_varA = 2

    def test_1(self):
        do_something_with_self.varA, self.varB

    def test_2(self):
        do_something_with_self_modified_varA, self.varC
Run Code Online (Sandbox Code Playgroud)

所以在unittest中,很容易将一堆测试放在一起,这些测试可以放在一个类下,然后对不同的方法使用许多不同的变量(varA和varB).在pytest中,我在conftest.py中创建了一个fixture而不是unittest中的类,就像这样......

@pytest.fixture(scope="module")
def input1():
    varA = 1
    varB = 2
    return varA, varB

@pytest.fixture(scope="module")
def input2():
    varA = 2
    varC = 3
    return varA, varC
Run Code Online (Sandbox Code Playgroud)

我将这个input1和input2作为两个不同的函数提供给我的函数在另一个文件中(比如说test_this.py).以下是基于以上信息的问题......

  1. 因为我不能在conftest.py中声明局部变量,因为我不能简单地导入这个文件.有没有更好的方法来声明不同的变量,可以在test_this.py中的不同函数中使用?我在实际测试这些变量时有五种不同的配置,在conftest.py中定义了许多不同的灯具,并在test_this.py的五个不同函数中使用它们作为函数参数听起来很痛苦,我宁愿回到unittest类结构,定义我的变量,挑选我想要的东西

  2. 我应该只在test_this.py中声明全局变量并按照我想要的方式在函数中使用它们吗?似乎有点不是pythonic.此变量仅由此文件中的函数使用.

  3. 假设我有test_that.py和test_them.py.如果我在这些不同的文件之间有一些共享变量,我将如何声明它们?只需在所有这些测试文件所在的目录中创建一个文件calle variables.py,并在需要时进行导入?这样我就可以将所有数据保持在一个单独的位置.

  4. 我的印象是pytest不鼓励使用类来组织你的功能吗?我在网上看到的每一个例子,似乎都只使用了一大堆功能.什么是定义类和方法的配置,并在pytest中组织测试?

  5. 我有一个测试场景,我必须将一个函数的结果用于另一个函数.使用pytest,我有一个断言,它位于函数的末尾而不是返回,所以我将无法将此函数用作夹具.我该如何做到这一点?我知道这不是一个好的做法,我的一个测试依赖于另一个,但是有一个解决方法吗?

提前感谢您的回答.

python unit-testing pytest

39
推荐指数
2
解决办法
4万
查看次数

如何加快py.test

有没有办法加快重复执行py.test?即使我指定在命令行上执行哪些文件,它似乎也会花费大量时间来收集测试.我知道它不是磁盘速度问题,因为在所有.py文件中运行pyflakes的速度非常快.

python performance pytest

38
推荐指数
4
解决办法
1万
查看次数

测试代码是否在py.test会话中执行

如果我的代码在py.test下运行,我想连接到不同的数据库.是否有一个函数可以调用或我可以测试的环境变量会告诉我是否在py.test会话下运行?处理这个问题的最佳方法是什么?

python pytest

38
推荐指数
4
解决办法
7555
查看次数

Pytest:如何使用输入调用测试函数?

我有一个用Python编写的控制台程序.它使用以下命令询问用户问题:

some_input = input('Answer the question:', ...)
Run Code Online (Sandbox Code Playgroud)

我将如何测试中,含有一个呼叫的功能input使用pytest?我不想强迫测试人员多次输入文本只完成一次测试运行.

python testing unit-testing input pytest

38
推荐指数
5
解决办法
2万
查看次数

标签 统计

pytest ×10

python ×9

unit-testing ×3

coverage.py ×1

input ×1

performance ×1

testing ×1