我正在尝试通过使用Click 包实现的命令来测试异常的引发。
这是我的命令:
@click.option(
'--bucket_name',
...)
@click.option(
'--group_id',
...)
@click.option(
'--artifact_id',
...)
@click.option(
'--version',
...)
@click.option(
'--artifact_dir',
required=False,
default='downloads/artifacts/',
...)
@click.command()
def download_artifacts(
bucket_name,
group_id, artifact_id, version,
artifact_dir
):
logger.info(
f"bucket_name: {bucket_name}, "
f"group_id: {group_id}, "
f"artifact_id: {artifact_id}, "
f"version: {version}, "
f"artifact_dir: {artifact_dir}, "
)
if not artifact_dir.endswith('/'):
raise ValueError(
"Enter artifact_dir ending with '/' ! artifact_dir: "
f"{artifact_dir}")
...
Run Code Online (Sandbox Code Playgroud)
这是我的测试代码,assertRaises它不起作用:
def test_download_artifacts_invalid_dir(
self,
):
runner = CliRunner()
with self.assertRaises(ValueError):
result = runner.invoke(
download_artifacts,
'--bucket_name my_bucket …Run Code Online (Sandbox Code Playgroud) 我想模拟一个函数requests.Session,该函数使用在上下文管理器中创建的对象来执行请求get,再次使用上下文管理器。所以涉及到两个上下文管理器。
这是一个示例代码:
# main.py
from requests import Session
def fun(session):
with session.get("https://httpstat.us/200") as response:
print(response)
def run():
with Session() as session:
fun(session)
if __name__ == "__main__":
run()
Run Code Online (Sandbox Code Playgroud)
200执行时,会按预期打印的状态代码。
现在我想模拟 get 请求,以返回不同的值。不知怎的,我无法浏览混乱的上下文管理器和返回值。
这是我最大的努力:
# maintest.py
from unittest.mock import patch
from main import run
def test_main():
with patch("main.Session") as mocked_session:
mocked_session.__enter__.return_value.get.__enter__.return_value = "MOCKED"
run()
Run Code Online (Sandbox Code Playgroud)
使用 pytest 运行测试,我希望得到"MOCKED"打印,但我得到了
<MagicMock name='Session().__enter__().get().__enter__()' id='140303100714240'>
__enter__我尝试过任何.get可以想象的组合.return_value
我有一个测试功能可以修补一些东西。一旦我达到了超过 2 或 3 个补丁,该功能就开始看起来很糟糕
def test_bla():
with patch(...):
with patch(...):
with patch(...):
# test
Run Code Online (Sandbox Code Playgroud)
所以我尝试开始使用装饰器。这是我的示例测试,当我引入补丁装饰器时,该测试会中断
import pytest
from unittest.mock import patch
class Example:
def _run(self, x):
return x
def run(self, x):
return self._run(x) + 1
@pytest.mark.parametrize('x', [1])
def test_example(x):
assert Example().run(x) == 2
@pytest.mark.parametrize('x', [1])
@patch('Example._run', return_value=0)
def test_example_failure(x):
with pytest.raises(AssertionError):
assert Example().run(x) == 2
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
platform linux -- Python 3.6.13, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: ..., configfile: pytest.ini
plugins: metadata-1.11.0
collected 0 items / 1 error
==================================================================================================== ERRORS ==================================================================================================== …Run Code Online (Sandbox Code Playgroud) views.py我有一个外部 API POST 调用,该调用是从我的内部进行的:
class MyView(APIView):
def post(self, request):
my_headers = {
"Content-Type": "application/json"
}
response = requests.post("https://some-external-api.com", data=json.dumps(request.data), headers=my_headers)
return Response(status.response.status_code)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这是一个非常简单的情况,使用视图端点接收到的相同数据对外部 API 进行 POST 调用。
现在,我正在尝试为此创建一个单元测试,同时模拟来自“https://some-external-api.com”的响应,因此我显然不必每次都对该单元进行实际调用测试运行。但我遇到了困难,因为我无法让模拟方面正常工作,并且每次请求都发送到实际的外部端点。
我知道网上有很多例子,但我尝试过的似乎都不起作用。我还没有看到模拟响应应该来自视图文件本身的示例。截至目前,我有这个:
@patch('requests.post')
def test_external_api_call(self, mock_post)
mock_post.return_value.ok = True
response = self.client.post(reverse('my-view'), {
//my random dummy json object goes here
}, format='json')
self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,使用上面的代码,实际调用了“https://some-external-api.com”,而不是被嘲笑。
python unit-testing python-requests python-unittest python-unittest.mock
当我跑:
python -m unittest discover unit_tests
要么
python setup.py test
我收到了很多ImportErrors关于blowdrycss项目的信息.
样品:
test_BreakpointParser (unittest.loader._FailedTest) ... ERROR
test_classExtractor (unittest.loader._FailedTest) ... ERROR
test_classPropertyParser (unittest.loader._FailedTest) ... ERROR
test_colorParser (unittest.loader._FailedTest) ... ERROR
test_CSSBuilder (unittest.loader._FailedTest) ... ERROR
test_CSSFile (unittest.loader._FailedTest) ... ERROR
test_CSSPropertyValueParser (unittest.loader._FailedTest) ... ERROR
...
ImportError: No module named 'settings'
ImportError: No module named 'blowdrycss_settings'
ImportError: No module named 'blowdrycss.blowdrycss_settings'
ImportError: No module named 'utilities'
ImportError: No module named 'breakpointparser'
Run Code Online (Sandbox Code Playgroud)
项目结构:
blowdrycss/
blowdrycss/
settings/
__init__.py
blowdrycss_settings.py
unit_tests/
__init__.py
test_BreakpointParser.py
test_*.py …Run Code Online (Sandbox Code Playgroud) 我有一个实现REST api的flask应用程序。由于某些原因,我正在使用HTTP摘要式身份验证。我已经使用了Flask-HTTPAuth库来实现摘要身份验证,并且它可以工作。但是,我无法在单元测试中进行身份验证。
对于单元测试,在设置身份验证之前,我正在执行以下操作:
class FooTestCase(unittest.TestCase):
def setUp(self):
self.app = foo.app.test_client()
def test_root(self):
response = self.app.get('/')
# self.assert.... blah blah blah
Run Code Online (Sandbox Code Playgroud)
在实施身份验证之前,这很好。现在,我得到一个401,它应作为摘要auth请求的初始响应。我进行了搜索,并遵循了一些与http基本身份验证相关的建议(使用参数data = {#various stuff}和follow_redirects = True),但是我没有成功。
在这种情况下,有谁知道如何实施单元测试?
python digest-authentication flask python-unittest flask-httpauth
我试图在一个类中修补多个方法。这是我的简化设置
Hook.py定义为
class Hook():
def get_key(self):
return "Key"
def get_value(self):
return "Value"
Run Code Online (Sandbox Code Playgroud)
HookTransfer.py定义为
from Hook import Hook
class HookTransfer():
def execute(self):
self.hook = Hook()
key = self.hook.get_key()
value = self.hook.get_value()
print(key)
print(value)
Run Code Online (Sandbox Code Playgroud)
我想模拟Hook类中的方法get_key和get_value。以下作品,即打印New_Key和New_Value
from HookTransfer import HookTransfer
import unittest
from unittest import mock
class TestMock(unittest.TestCase):
@mock.patch('HookTransfer.Hook.get_key', return_value="New_Key")
@mock.patch('HookTransfer.Hook.get_value', return_value="New_Value")
def test_execute1(self, mock_get_key, mock_get_value):
HookTransfer().execute()
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
但是,事实并非如此。它打印<MagicMock name='Hook().get_key()' id='4317706896'>并<MagicMock name='Hook().get_value()' id='4317826128'>
from HookTransfer import HookTransfer
import unittest
from unittest import mock
class TestMock(unittest.TestCase):
@mock.patch('HookTransfer.Hook', …Run Code Online (Sandbox Code Playgroud) 我使用pymysql客户端库连接到真正的数据库.我在模块的功能,在这里我在python这个功能连接到使用pymysql数据库,并只做数据库插入operations.How单元测试没有击中真实的数据库?
import pymysql
def connectDB(self):
# Connect to the database
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db')
try:
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('newuser@some.com', 'newpassword'))
connection.commit()
Run Code Online (Sandbox Code Playgroud)
我的python版本是2.7.
python unit-testing python-2.7 python-unittest python-unittest.mock
我在Python中有一个testSuite,有几个使用单元测试框架的测试用例.我正在使用进口单元测试
如果测试用例中的测试步骤失败,则测试用例将进入拆解类.即使一个测试用例失败,我还想继续测试用例的其余部分.
单元测试的默认行为:如果任何测试步骤失败,它将拆除类并结束测试用例.
测试步骤:我的意思是断言相等并且像这个内置的proc,它定义了它是失败还是通过
在独立pytest测试用例中,我想使用断言unittest.TestCase.assertNotIn(和unittest其他断言),而不依赖任何uniittest模块。使用python-assert之类的库是最佳实践吗?
python ×10
python-unittest ×10
unit-testing ×3
pytest ×2
flask ×1
importerror ×1
mocking ×1
patch ×1
python-2.7 ×1
python-click ×1
python-mock ×1
testing ×1