python-3.x - 修补 boto3.resource 和 resource.Table 方法进行单元测试

标签 python-3.x unit-testing

这是我的类(class):

# Production.py
import boto3


class Production(object):
    resource = boto3.resource('dynamodb', 'us-west-2')

    def __init__(self):
        self.table = Production.resource.Table('employee')

我正在尝试测试该resource.Table是用arg“employee”调用的。我为它编写了一个单元测试

def test_init():
   with patch('Production.boto3.resource') as resource:
       mock_resource = MagicMock()
       resource.return_value = mock_resource
       pd = Production()
       resource.assert_called_with('dynamodb', 'us-west-2')
       table = resource.return_value.Table.return_value

       table.assert_called_with('employee')


test_init()

但它似乎不起作用...有人可以帮助我如何测试这个吗?

最佳答案

当你修补一个对象时,它会为你模拟它的所有方法。所以(我没有测试代码,但是)我认为:

def test_resource_is_called_with_correct_params():
    with patch('Production.boto3') as mock_boto:
        Production()
        mock_boto.resource.assert_called_once_with('dynamodb', 'us-west-2')

将完成测试的第一部分。然后,我将在另一个测试中单独测试 init 函数,这更清晰、更容易、更简单(通常旨在每个测试测试一件事):

def test_table_is_called_with_correct_params():
    with patch('Production.boto3') as mock_boto:
        Production()
        mock_resource = mock_boto.resource.return_value
        mock_resource.Table.assert_called_once_with('employee')

对此我想说几句话:

  1. 将您的测试分组到一个可以组织您的测试的类中是件好事。此外,当您获得 TestsCase 子类时,您会获得一系列附带的方法,例如 self.assertDictEqual ,它将提供良好的有意义的输出,并且可以很好地测试像nose2这样的运行程序。因此,请执行以下操作:

    class TestProduction(unittest.TestCase):
        def test1():
            pass
    
        def test2():
            pass
    
  2. 您正在测试的内容基本上是硬编码的,因此这些测试并没有真正的意义。您只是在测试该语言是否有效。我会学习测试行为而不是实现......那么你希望你的类(class)做什么?在写类(class)之前先坐下来思考一下。然后,您可以在开始编码之前写出规范并使用这些规范来设计测试。

关于python-3.x - 修补 boto3.resource 和 resource.Table 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227469/

相关文章:

python-3.x - 使用 python 在 uva 中提交代码时出现运行时错误

python - 比较 pandas DataFrame 列中的多个字符串

c# - 如何使用 XUnit 对 Web API Controller 进行单元测试

python - Pandas 从多行创建链接对

python - 当 Pycharm 不断失败时,如何在 Pycharm 中安装旧版本的 Pip?

python - 我应该对私有(private)/ protected 方法进行单元测试吗

javascript - 单元测试时刻日期 - 内存地址问题?

java - 在Java中测试服务层的void方法

c# - Moq 模拟泛型和表达式函数

python - 蒙蒂霍尔模拟器有一个错误的结果