作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序可以在 Linux 上与 block 设备(/dev/sda 等)交互并更改它。我正在使用各种外部命令(主要是来自 fdisk 和 GNU fdisk 包的命令)来控制设备。我创建了一个类作为 block 设备的大多数基本操作的接口(interface)(有关信息,例如:它有多大?它安装在哪里?等)
这是查询分区大小的一种方法:
def get_drive_size(device):
"""Returns the maximum size of the drive, in sectors.
:device the device identifier (/dev/sda and such)"""
query_proc = subprocess.Popen(["blockdev", "--getsz", device], stdout=subprocess.PIPE)
#blockdev returns the number of 512B blocks in a drive
output, error = query_proc.communicate()
exit_code = query_proc.returncode
if exit_code != 0:
raise Exception("Non-zero exit code", str(error, "utf-8")) #I have custom exceptions, this is slight pseudo-code
return int(output) #should always be valid
所以这个方法接受 block 设备路径,并返回一个整数。测试将以 root 身份运行,因为整个程序最终都必须以 root 身份运行。
我应该尝试并测试这些方法之类的代码吗?如果是这样,如何?我可以尝试为每个测试创建和挂载图像文件,但这看起来开销很大,而且本身可能容易出错。它需要 block 设备,所以我不能直接操作文件系统中的图像文件。
我可以尝试 mock ,正如一些答案所暗示的那样,但这感觉不够。如果我模拟 Popen 对象而不是输出,我似乎开始测试该方法的实现。在这种情况下,这是对适当的单元测试方法的正确评估吗?
我在这个项目中使用的是python3,我还没有选择单元测试框架。如果没有其他原因,我可能会使用 Python 中默认包含的单元测试框架。
最佳答案
您应该查看 mock 模块(我认为它现在是 Python 3 中 unittest 模块的一部分)。
它使您无需依赖任何外部资源即可运行测试,同时让您控制模拟与代码的交互方式。
我将从 Voidspace 中的文档开始
这是一个例子:
import unittest2 as unittest
import mock
class GetDriveSizeTestSuite(unittest.TestCase):
@mock.patch('path/to/original/file.subprocess.Popen')
def test_a_scenario_with_mock_subprocess(self, mock_popen):
mock_popen.return_value.communicate.return_value = ('Expected_value', '')
mock_popen.return_value.returncode = '0'
self.assertEqual('expected_value', get_drive_size('some device'))
关于python - 如何对与 block 设备交互的程序进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39888013/
我是一名优秀的程序员,十分优秀!