gpt4 book ai didi

python - 如何对与 block 设备交互的程序进行单元测试

转载 作者:行者123 更新时间:2023-11-28 17:24:32 25 4
gpt4 key购买 nike

我有一个程序可以在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com