您好,我在"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)
此时结果是我构建报告的时候.
所以欢迎任何建议
谢谢 !!
我有一个像这样结构的项目:
|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
我浏览了python的单元测试用例模块,发现有办法使用TestCase.fail()对象强制测试用例失败。但是我没有发现任何会迫使测试用例出错的东西。关于如何做到这一点的任何想法?
编辑:
更多解释
很久以前编写的测试脚本很少,我现在正在使用它们来测试固件。这些测试脚本使用 python 的 UnitTest 模块。测试脚本还导入了一堆其他用户编写的模块。所有这些用户编写的模块都很少抛出异常。因此,每当测试用例不从具有正确输入的用户编写的模块调用方法时,就会抛出异常。UnitTest 模块正确地将所有此类测试用例标记为错误。但是通过查看 UnitTest 模块的输出,它只是对生成异常的行的回溯,我并不能立即清楚,因为生成了异常的输入。所以我用try-except在测试脚本中构造以捕获异常并打印出作为异常原因的输入。但是由于我处理了异常,UnitTest 将这些测试用例标记为通过。raise正如@alecxe 所指出的,在 except 块中使用语句解决了这个问题。
问题标题是不言自明的。有没有办法
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()以显示完整的文档字符串。
如果不是模拟模块中的函数,而是想模拟__dict__模块的属性,我将如何去做?显然像
@patch(my_module.__dict__)
test_something(my_module_dict):
my_module_dict.return_value = "something"
Run Code Online (Sandbox Code Playgroud)
不起作用
我正在使用 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 运行一些 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 的模拟库和 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,但没有奏效。
关于在这种情况下可能起作用的任何想法?
谢谢!
我正在尝试编写一个测试用例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) 我正在使用 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 ×10
python-unittest ×10
unit-testing ×5
mocking ×3
aiohttp ×1
pytest ×1
python-2.7 ×1
sanic ×1