使用 subprocess.Popen 的单元测试 Python 代码

2024-02-19

我有一个 Python 项目,在其中读取外部文件,处理它们,并将结果写入新文件。输入文件可以直接读取,也可以使用以下命令从 git 存储库中提取git show。要调用的函数git show并返回标准输出如下所示:

def git_show(fname, rev):
    '''Runs git show and returns stdout'''
    process = subprocess.Popen(['git', 'show', '{}:{}'.format(rev, fname)],
                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    ret_code = process.wait()
    if ret_code:
        raise Exception(stderr)
    return stdout

我有单元测试来测试程序的整个处理部分,即除了读取和写入文件之外的所有内容。但是,我偶然发现(并修复了)有关返回字符串的编码的问题git_show(),取决于 Python 版本,很可能还取决于操作系统和要读取的实际文件。

我想设置一个单元测试git_show()这样我就可以确保整个应用程序从输入到输出都能正常工作。然而,据我所知,如果没有实际的 git 存储库来测试,这是不可能的。整个包是用 git 进行版本管理的,我希望如果我在 git 存储库中有一个 git 存储库,那么它本身可能会导致问题,并且我脑海中的一个声音告诉我这可能不是最好的解决方案。

如何最好地实现从以下位置获取输入的单元测试代码git show(一般来说,命令行 /Popen.communicate())?


所以我这样做的方法是pytest https://pytest.org

Example: (做作的)

from subprocess import Popen, PIPE


def test():
    p = Popen(["echo", "Hello World!"], stdout=PIPE)
    stdout, _ = p.communicate()

    assert stdout == b"Hello World!\n"

Output:

$ py.test -x -s test_subprocess.py 
======================================= test session starts ========================================
platform linux2 -- Python 2.7.9 -- py-1.4.28 -- pytest-2.7.1
rootdir: /home/prologic/work/circuits, inifile: 
plugins: cov
collected 1 items 

test_subprocess.py .

===================================== 1 passed in 0.01 seconds =====================================

或者使用标准库unittest https://docs.python.org/2/library/unittest.html:

Example:

#!/usr/bin/env python


from unittest import main, TestCase


from subprocess import Popen, PIPE


class TestProcess(TestCase):

    def test(self):
        p = Popen(["echo", "Hello World!"], stdout=PIPE)
        stdout, _ = p.communicate()

        self.assertEquals(stdout, b"Hello World!\n")


if __name__ == "__main__":
    main()

Output:

$ python test_subprocess.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 subprocess.Popen 的单元测试 Python 代码 的相关文章

随机推荐

  • 如何通过已知路由器上的三角测量来确定我的位置?

    有没有可用的开源软件 基本上 我只想根据位置固定且已知的路由器的信号强度进行三角测量 我意识到可能存在干扰的情况 但我们还是坚持列出已知的源代码 谢谢 我不知道任何三边测量软件 有人应该编写一个开源库 看看三边测量 http en wiki
  • 错误 NETSDK1064:找不到软件包 DnsClient,1.2.0

    我有一个 Asp Net core docker 镜像 我上次尝试构建它是两个月前 现在 我在尝试构建它时遇到错误 有任何想法吗 是不是有什么东西破坏了 Microsoft docker 镜像 当尝试在 Elasticbeanstalk 实
  • Python“数组索引太多”

    我正在使用 pandas 读取 python 中的文件 然后将其保存在 numpy 数组中 该文件的尺寸为 11303402 行 x 10 列 我需要拆分数据以进行交叉验证 为此我将数据切片为 11303402 行 x 9 列的示例和 1
  • 在 Cython 类中,使用 __init__ 和 __cinit__ 有什么区别?

    代码块1使用 init cython 3 cdef class c cdef int a str s def init self self a 1 self s abc def get vals self return self a sel
  • 服务器使用 HTTP Keep-Alive 与客户端通信

    最近在一次采访中 我被问到如何处理在线聊天客户端应用程序 我经历了标准的 轮询 解决方案 但被打断了 因为面试官正在寻找 HTTP 1 1 keep alive 方法 使用 HTTP 相当长一段时间并记住重点是 无状态 这对我来说从来没有发
  • 无法对测试运行“xxxx 2011-10-20 13:00:00”进行排队。您没有执行该操作的适当权限

    我正在尝试在 C VS2010 中运行我的测试用例 但突然有一天 它开始向我展示无法对测试运行 xxxx 2011 10 20 13 00 00 进行排队 您没有执行该操作的适当权限 错误 虽然我通过我的测试进行了调试 但无法选择并运行它
  • 如果连接丢失,从 SQL Server 到 Oracle 服务器的 OpenQuery 将无限期挂起

    我有一个在 SQL Server 2005 数据库上运行的计划作业 它运行一个从视图导入数据的存储过程 该视图由一个OPENQUERY到链接的 Oracle 服务器 我无法控制 Oracle 服务器 它在地理上和虚拟上都与 Sql Serv
  • 如何重命名本地 Git 分支?

    如何重命名尚未推送到远程存储库的本地分支 Related 重命名本地和远程 Git 存储库的 master 分支 https stackoverflow com questions 1526794 rename master branch
  • 如何在 Swift 中为 iOS 制作垂直文本 UILabel 和 UITextView?

    如果您根据标题提出这个问题 但对蒙古语不感兴趣 您可能会寻找以下问答 Swift 如何旋转 UIButton 和 UILabel 的文本 https stackoverflow com questions 28717634 swift ho
  • JSoup.clean() 不保留相对 URL

    我努力了 Whitelist relaxed Whitelist relaxed preserveRelativeLinks true Whitelist relaxed addProtocols a href http https mai
  • jQuery 检测 cookie 已启用

    我有一个基于 jQuery 的网络应用程序 我的要求相当简单 我想使用 jQuery 来查明用户是否在其 Web 浏览器中启用或禁用了 cookie 我知道有一个可用的插件可用于创建 检索 删除 更新 cookie 但是 有没有办法 jQu
  • 字符串类型不可变的非技术好处

    我想知道从程序员的角度来看 字符串类型不可变的好处 技术优势 在编译器 语言方面 可以概括为 如果类型是不可变的 则更容易进行优化 读here https stackoverflow com questions 2916358 immuta
  • Crypto++ 输出数据长度

    我正在尝试使用 Crypto 库中的 AES 加密 CBC Mode
  • 将 void* 转换为 double

    我正在尝试使用pthread计算库n斐波那契数列其中n可以来自范围0 1000 当我尝试输入我的内容时 我遇到了一个奇怪的错误void to a double 在我的主要部分中 我调用了计算斐波那契函数 pthread create tid
  • Cookie 存在安全风险吗?

    假设我们有一个网站询问用户的姓名 然后 网站将该值存储在 cookie 中 并在下一页上通过 PHP 检索该值并以某种方式使用它 可能该页面将名称显示为文本 用户是否可以修改cookie数据来注入恶意代码 脚本检索 cookie 数据时是否
  • Chrome 浏览器中无法启用静默调试

    我无法在最新更新的 Chrome 浏览器中看到 Chrome 浏览器标志之一 启用静默调试 如果该标志已更改为其他标志 请告诉我 该标志在版本 79 之后被删除 您仍然可以使用命令选项激活它chrome exe silent debugge
  • 获取 mongodb 查询中项目的索引

    我有一个查询 如下所示 function getPage page return db messages aggregate group id subjectID skip page 20 limit 20 说我有一个subjectID我知
  • 使用 SASS 将列表作为单个参数传递给 mixin

    我喜欢用 SASS 制作 mixins 这有助于我实现良好的跨浏览器兼容性 我想制作一个如下所示的 mixin mixin box shadow value box shadow value webkit box shadow value
  • 如何使用 bean 的属性格式化字符串

    我想使用某种格式创建一个字符串 用 bean 的属性替换格式中的一些标记 是否有支持此功能的库 或者我是否必须创建自己的实现 让我用一个例子来演示一下 说我有一颗豆子Person public class Person private St
  • 使用 subprocess.Popen 的单元测试 Python 代码

    我有一个 Python 项目 在其中读取外部文件 处理它们 并将结果写入新文件 输入文件可以直接读取 也可以使用以下命令从 git 存储库中提取git show 要调用的函数git show并返回标准输出如下所示 def git show