标签: python-unittest

测试 Python Click 命令异常

我正在尝试通过使用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)

python command-line-interface python-unittest python-click

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

嵌套上下文管理器中的模拟 requests.Session.get

我想模拟一个函数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

python mocking python-requests python-unittest

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

如何在使用 mark.parametrize 装饰器的同时使用 patch 装饰器?

我有一个测试功能可以修补一些东西。一旦我达到了超过 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)

python unit-testing patch pytest python-unittest

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

从测试视图 Python 中模拟外部 API POST 调用

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

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

如何解决unittest ImportErrors

当我跑:

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)

python importerror python-unittest

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

如何在Flask中对HTTP摘要式身份验证进行单元测试?

我有一个实现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

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

Python Mock在一个类中修补多个方法

我试图在一个类中修补多个方法。这是我的简化设置

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)

python python-mock python-unittest

3
推荐指数
3
解决办法
7896
查看次数

Python单元测试:如何对包含数据库操作的模块进行单元测试?

我使用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

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

在单元测试python中出现故障步骤时运行测试用例

我在Python中有一个testSuite,有几个使用单元测试框架的测试用例.我正在使用进口单元测试

如果测试用例中的测试步骤失败,则测试用例将进入拆解类.即使一个测试用例失败,我还想继续测试用例的其余部分.

单元测试的默认行为:如果任何测试步骤失败,它将拆除类并结束测试用例.

测试步骤:我的意思是断言相等并且像这个内置的proc,它定义了它是失败还是通过

python python-unittest

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

在独立的pytest测试中使用unittest kind断言(如assertNotIn)的最佳实践?

在独立pytest测试用例中,我想使用断言unittest.TestCase.assertNotIn(和unittest其他断言),而不依赖任何uniittest模块。使用python-assert之类的库是最佳实践吗?

python testing pytest python-unittest

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