标签: python-unittest

Python unittest报告通过了测试

您好,我在"test.py"下有一个如下所示的测试模块:

class TestBasic(unittest.TestCase):
    def setUp(self):
        # set up in here

class TestA(TestBasic):
    def test_one(self):
        self.assertEqual(1,1)

    def test_two(self):
        self.assertEqual(2,1)

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我需要一种方法来打印传递的测试,例如我可以将输出打印到控制台:

test_one: PASSED
test_two: FAILED
Run Code Online (Sandbox Code Playgroud)

现在扭曲,我可以在self.assertEqual()之后添加一个print语句,这将是一个通过的测试,我可以打印它,但我需要从另一个模块运行测试,让我们说"test_reporter.py" "我有这样的地方:

import test
suite = unittest.TestLoader().loadTestsFromModule(test)
results = unittest.TextTestRunner(verbosity=0).run(suite)
Run Code Online (Sandbox Code Playgroud)

此时结果是我构建报告的时候.

所以欢迎任何建议

谢谢 !!

python unit-testing python-unittest

1
推荐指数
1
解决办法
2345
查看次数

python unittest导入类子目录

我有一个像这样结构的项目:

|tools/
|-- test/
|   |-- __init__.py
|   |-- test_class1.py
|   |-- test_class2.py
|   
|-- tools/
|-- __init__.py
|   |-- class1.py
|   |-- class2.py
|   
|-- test_runner (Python script that calls unittest.TestLoader().discover('test'))
|-- README.md
Run Code Online (Sandbox Code Playgroud)

我想运行test_runner并让它执行test文件夹中的所有测试.我的个人测试会有这样的一行:from test_class import TestClass测试适当的类.

test_runner 看起来像这样:

#!/usr/bin/env python

import unittest
import sys
import os
sys.path.append(os.path.realpath(__file__) + '/tools') 

suite = unittest.TestLoader().discover('test')
results = unittest.TextTestRunner(verbosity=2).run(suite)
if len(results.errors) > 0 or len(results.failures) > 0:
    sys.exit(1)
sys.exit()
Run Code Online (Sandbox Code Playgroud)

现在这不起作用,我的测试文件无法导入相应的类.如果我这样做,我可以让它工作,export PYTHONPATH=/path/to/file但我希望通过脚本实现这一点.

我也尝试sys.path.insert(0, os.path.dirname(__file__) …

python unit-testing python-import python-2.7 python-unittest

1
推荐指数
1
解决办法
2408
查看次数

在 Python 中强制单元测试用例为 ERROR

我浏览了python的单元测试用例模块,发现有办法使用TestCase.fail()对象强制测试用例失败。但是我没有发现任何会迫使测试用例出错的东西。关于如何做到这一点的任何想法?

编辑:

更多解释

很久以前编写的测试脚本很少,我现在正在使用它们来测试固件。这些测试脚本使用 python 的 UnitTest 模块。测试脚本还导入了一堆其他用户编写的模块。所有这些用户编写的模块都很少抛出异常。因此,每当测试用例不从具有正确输入的用户编写的模块调用方法时,就会抛出异常。UnitTest 模块正确地将所有此类测试用例标记为错误。但是通过查看 UnitTest 模块的输出,它只是对生成异常的行的回溯,我并不能立即清楚,因为生成了异常的输入。所以我用try-except在测试脚本中构造以捕获异常并打印出作为异常原因的输入。但是由于我处理了异常,UnitTest 将这些测试用例标记为通过。raise正如@alecxe 所指出的,在 except 块中使用语句解决了这个问题。

python unit-testing python-unittest

1
推荐指数
1
解决办法
2432
查看次数

Python unittest,如何在报告中显示TestCase的方法的文档字符串?

问题标题是不言自明的。有没有办法

class Foo(TestCase):
  def test_bar(self):
    """
    a docstring
    """
Run Code Online (Sandbox Code Playgroud)

使UnitTest报告显示整个文档字符串?

我已经读过文档字符串的第一行将被打印(所以写

""" a docstring """
Run Code Online (Sandbox Code Playgroud)

没有换行符有效)

我读过这个问题:How to stop Python unittest from print test docstring?

但是,这是关于删除文档字符串,我不知道如何覆盖shortDescription()以显示完整的文档字符串。

python python-unittest

1
推荐指数
1
解决办法
1632
查看次数

Mock module.__dict__ 使用 Python Mock

如果不是模拟模块中的函数,而是想模拟__dict__模块的属性,我将如何去做?显然像

@patch(my_module.__dict__)
test_something(my_module_dict):
    my_module_dict.return_value = "something"
Run Code Online (Sandbox Code Playgroud)

不起作用

python mocking python-unittest

1
推荐指数
1
解决办法
1114
查看次数

python unitests for sanic 应用程序

我正在使用 peewee ORM 和 sanic(sanic-crud) 作为应用程序服务器构建 CRUD REST API。一切正常。我为此编写了几个单元测试用例。

但是,我在运行单元测试时遇到了问题。问题是 unittests 启动了 sanic 应用程序服务器并停滞在那里。它根本没有运行单元测试用例。但是,当我手动按 Ctrl+C 时,sanic 服务器将终止并开始执行单元测试。因此,这意味着应该有一种方法可以启动 sanic 服务器并继续运行单元测试并在最后终止服务器。

有人可以请我为sanic应用程序编写单元测试用例的正确方法吗?

我也遵循了官方文档,但没有运气。 http://sanic.readthedocs.io/en/latest/sanic/testing.html

我试过

from restapi import app # the execution stalled here i guess
import unittest
import asyncio
import aiohttp

class AutoRestTests(unittest.TestCase):
    ''' Unit testcases for REST APIs '''

    def setUp(self):
        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(None)

    def test_get_metrics_all(self):
        @asyncio.coroutine
        def get_all():
            res = app.test_client.get('/metrics')
            assert res.status == 201
        self.loop.run_until_complete(get_all())
Run Code Online (Sandbox Code Playgroud)

来自restapi.py

app = Sanic(__name__)
generate_crud(app, [Metrics, ...])
app.run(host='0.0.0.0', port=1337, workers=4, debug=True)
Run Code Online (Sandbox Code Playgroud)

python python-unittest python-asyncio aiohttp sanic

1
推荐指数
1
解决办法
1615
查看次数

以编程方式在 pytest 插件中注册夹具

我正在寻找一种从 Python 运行一些 pytest 单元测试并动态注册 pytest 夹具的方法。如 Pytest 文档中所述,以编程方式运行测试时,可以使用自定义插件更改其行为。我有以下设置

validation.py (包含要运行的测试)

def test_valid(new_fixture):
    assert new_fixture > 0
Run Code Online (Sandbox Code Playgroud)

启动时,

import pytest

new_fixture_value = 36

class FixtureRegPlugin(object):
    def pytest_sessionstart(self):
        print('Test session start')

        @pytest.fixture
        def new_fixture():
            return new_fixture_value

pytest.main(['-sv', './validation.py'], plugins=[FixtureRegPlugin()])
Run Code Online (Sandbox Code Playgroud)

在这里,我们validation.py使用一个自定义插件运行测试,该插件为pytest_sessionstart. 这个钩子在测试会话开始时执行,我可以看到预期的打印输出。但是,new_fixture未注册,因此测试失败并显示“未找到夹具”错误。

目标是在运行时修改夹具的结果,因此我不能将其定义放在validation.py.

python pytest python-unittest

1
推荐指数
1
解决办法
2243
查看次数

当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用

我正在使用 Python 的模拟库和 unittest。我正在为一个类编写单元测试,该类在其方法之一中使用外部库的函数。根据情况,此函数返回不同的值。

假设我想测试 A 类:

from external_library import function_foo

class A(object):
...
Run Code Online (Sandbox Code Playgroud)

在我的测试类中,为了使用函数从外部库返回的值,我创建了一个补丁,定义了补丁后才导入类A。但是,我需要在我所有的测试方法中使用这个函数,并且在每个方法中它返回不同的值。

我的测试类如下:

class TestA(TestCase):

    @patch('external_library.function_foo', side_effect=[1, 2, 3])    
    def test_1(self, *patches):

       from module import class A
       obj = A()
       ...

    @patch('external_library.function_foo', side_effect=[1, 1, 2, 2, 3, 3])    
    def test_2(self, *patches):

       from module import class A
       obj = A()
       ...

    ...
Run Code Online (Sandbox Code Playgroud)

我有 10 个测试,当我同时运行所有测试时,只有 1 个(第一个)通过,其余的,我得到StopIteration错误。但是,如果我单独运行它们中的每一个,它们都会通过

我尝试with patch('external_library.function_foo', side_effect=[...])在每种方法中使用,但结果是一样的。我还尝试在setUp方法中只创建一次补丁,启动它,在每个方法中重新分配 side_effect,然后在 中停止tearDown,但没有奏效。

关于在这种情况下可能起作用的任何想法?

谢谢!

python unit-testing mocking python-unittest

1
推荐指数
1
解决办法
2052
查看次数

python单元测试补丁模拟方法不返回返回值

我正在尝试编写一个测试用例test_is_user_present(),它execute_redshift_sql()redshift_util.py脚本调用另一个函数

我将函数 execute_redshift_sql() 的预期返回值设置为1. 但是我从来没有在调用函数后从结果中得到这个值!我还打印了一些用于调试目的的值

你可以看看下面的测试用例

from mock import patch, Mock, MagicMock
from cia_admin_operations.redshift_util import  execute_redshift_sql
    @patch('cia_admin_operations.redshift_util.execute_redshift_sql')
    def test_is_user_present(mock_execute_redshift_sql):
        ldap_user = "dummy_user"
        mock_out = Mock()

        user_check_sql = "SELECT COUNT(1) FROM pg_user WHERE usename = '{}';".format(ldap_user)

        mock_execute_redshift_sql.return_value = 1
        print(mock_execute_redshift_sql())

        result = execute_redshift_sql(mock_out, user_check_sql)
        print(result)
        print(result())
>       assert result() == 1
E       AssertionError: assert <Mock name='m...749067684720'> == 1
E         -<Mock name='mock.query().getresult()()' id='139749067684720'>
E         +1

test/test_cia_admin_operations.py:51: AssertionError
----------------------------- Captured stdout call -----------------------------
1
<Mock …
Run Code Online (Sandbox Code Playgroud)

python unit-testing mocking python-unittest

1
推荐指数
1
解决办法
1247
查看次数

Python unittest 找不到属性

我正在使用 Visual Studio 2019、Python 和 unittest 库编写集成测试。

我有这个代码:

import unittest
import mysql.connector as mysql

class Test_Database_Integration_test(unittest.TestCase):

    def setup(self):
        self.db = mysql.connect(
                host = "localhost",
                user = "root",
                passwd = "password",
                database = "database")
        self.cursor = self.db.cursor() 


    def truncate_database(self):
   
        query = "TRUNCATE `database`.`map_start_conditions`"

        self.cursor.execute(query)
        self.db.commit()


    def test_Truncate_Database(self):

        self.truncate_database()

        query = "SELECT * FROM `database`.`map_start_conditions`"

        self.cursor.execute(query)
        records = self.cursor.fetchall()
        assert len(records) == 0

if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到一个错误,即 Test_Database_Integration_test 没有游标属性。

为什么是这样?

python python-unittest visual-studio-2019

1
推荐指数
1
解决办法
22
查看次数