【问题标题】:How to mock FTP connection with FTPS/TLS version 1.2?如何使用 FTPS/TLS 1.2 版模拟 FTP 连接?
【发布时间】:2021-03-01 17:15:20
【问题描述】:

我有一个 Python 代码来使用 FTPS 和 TLS 版本 1.2 从 FPT 读取一些文件,这是功能,凭证是从 AWS 机密管理器中读取的:

def ftp_connection(host, username, password):

    try:
        ftp_connection = ftplib.FTP_TLS(host, username, password)

        # set TLS version 1.2
        ftp_connection.ssl_version = ssl.PROTOCOL_TLSv1_2

        # switching to secure data connection
        ftp_connection.prot_p()

    except ftplib.all_errors as err:
        print(err)

    return ftp_connection

我想知道如何为这个函数编写单元测试,我想测试一下: 1.验证 TLS v1.2 连接 2. 验证它是否使用安全数据连接

我是单元测试的新手,还有什么可以添加到单元测试中的吗?非常感谢。

这是我按照page 中的第一个答案所尝试的:

@patch('ftplib.FTP_TLS', autospec=True)
    def test_open_ftp_connection(self, mock_ftp_constructor):
        mock_ftp = mock_ftp_constructor.return_value
        read_news_ftp_read.open_ftp_connection('test_host', 'test_username', 'test_password')

        mock_ftp_constructor.assert_called_with('test_host', 'test_username', 'test_password')
        self.assertTrue(mock_ftp.login.called)

这给了我错误:

  File "C:\User\AppData\Local\Continuum\anaconda3\envs\Env-python3.7\lib\unittest\case.py", line 692, in assertTrue
    raise self.failureException(msg)
AssertionError: False is not true


Assertion failed

【问题讨论】:

  • 在外部做任何事情都会使测试失去作为单元测试的资格。您正在尝试做的更多的是集成或端到端测试。
  • 嗨@KlausD。我只是想弄清楚为此编写单元测试的最佳方法......
  • 要成为单元测试,您必须模拟 FTP 连接。在单元测试中,您不测试ftplib,也不测试 FTP 连接。您只是在测试您是否使用应该使用的ftplib。使用unittest.mockftplib.FTP_TLS 替换为Mock 并测试mock 是否按计划使用。
  • @KlausD。嗨,我试过mock,但出现错误,我已经更新了我的问题,你能帮我看看吗?非常感谢。
  • 模拟将构造函数的参数存储为属性:例如mock_ftp_constructor.host.

标签: python unit-testing ssl python-unittest ftplib


【解决方案1】:

注意:您的ftp_connection() 函数不会在ftp 连接上调用login()

我在您的生产代码中没有看到任何 login 调用。所以断言

self.assertTrue(mock_ftp.login.called)

将失败:所以,如果您只是忘记在您的生产代码中调用login...哇,测试就像一个魅力并暴露了一个生产错误。否则,只需删除此断言。

【讨论】:

    【解决方案2】:

    我认为你问的是一个不太理想的问题:

    如何为这个函数编写单元测试,我想测试一下: 1.验证 TLS v1.2 连接 2.验证它使用的是安全数据连接

    这两件事都超出了您的控制范围 - FTP 服务器可能已关闭或更改,或者其证书可能会过期。这意味着您的单元测试将通过一次而下一次失败而没有任何更改,这使得它成为一个糟糕的单元测试,因为它没有测试代码的“单元”。

    另一种方法是在测试期间创建一个 FTP 服务器,例如https://pytest-localftpserver.readthedocs.io 然后您可以添加虚拟文件以匹配您期望在服务器上的内容,运行您的代码,然后检查它是否输出您期望的内容。这不是一个完美的解决方案,但它是一个实用的解决方案,应该让您对自己的代码充满信心,但不会花费大量时间和精力来设置和使用。

    另一种选择是进行端到端测试,您可以在其中联系外部服务器。它不会告诉您代码的特定版本是否有效,例如找到破坏东西的更改,但它会在运行端到端测试时告诉您它是否正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多