【发布时间】: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.mock将ftplib.FTP_TLS替换为Mock并测试mock 是否按计划使用。 -
@KlausD。嗨,我试过
mock,但出现错误,我已经更新了我的问题,你能帮我看看吗?非常感谢。 -
模拟将构造函数的参数存储为属性:例如
mock_ftp_constructor.host.
标签: python unit-testing ssl python-unittest ftplib