微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 FTPS/TLS 1.2 版模拟 FTP 连接?

如何解决如何使用 FTPS/TLS 1.2 版模拟 FTP 连接?

我有一个 Python 代码,可以使用 FTPS 和 TLS 1.2 版从 FPT 读取一些文件,这是函数,凭据是从 AWS 秘密管理器读取的:

def ftp_connection(host,username,password):

    try:
        ftp_connection = ftplib.FTP_TLS(host,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_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

解决方法

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

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

self.assertTrue(mock_ftp.login.called)

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

,

我认为您问的问题不太理想:

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。