当前位置: 首页 > 知识库问答 >
问题:

Python单元测试If语句的预期输出

印劲
2023-03-14

我目前正在创建一些单元测试。我对他们来说相当陌生,只是想弄湿我的脚。因此,我试图运行的当前测试是根据用户输入检查预期输出。因此,我会用某种类型的值修补输入,然后检查是否在最后收到stdout消息。听起来有点混乱,但我希望有人能帮忙。这是我的运行代码。

def main():


  Attack = input("Are we being attacked?!")

  if(Attack == "yes"):
    print("We are being attacked! Attack Back!")

因此,在上面的示例中,我将测试print语句,因为我将使用yes值修补用户输入。这是我的测试套件

import unittest
from unittest.mock import patch
import io
import sys

from RunFile import main

class GetInputTest(unittest.TestCase):

  @patch('builtins.input', return_value='yes')
  def test_output(self):
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          main()
          output = out.getvalue().strip()
          self.assertEqual(output, "We are being attacked! Attack Back!")
      finally:
          sys.stdout = saved_stdout


if __name__ == "__main__":
  unittest.main()

所以这显然行不通。那我错过了什么?提前谢谢大家!

编辑:这是我运行测试时收到的错误消息。我理解这个错误,只是不知道该如何去修复它。

Error
Traceback (most recent call last):
  File "C:\Python33\lib\unittest\mock.py", line 1087, in patched
    return func(*args, **keywargs)
TypeError: test_output() takes 1 positional argument but 2 were given

共有2个答案

卢子民
2023-03-14

除了@chepner的答案,您还需要使用unittest。TestCase断言方法而不是断言自己(双关语)

class TestStuff(unittest.TestCase):
    @patch('builtins.input', return_value='yes')
    def test_output(self, new_input):
        try:
            out = io.StringIO()
            sys.stdout = out
            main()
            output = out.getvalue().strip()
            self.assertEqual(output, "We are being attacked! Attack Back!")
        finally:
            sys.stdout = saved_stdout

然而,这可能不是做你想做的事情的最佳方式。你可以修补多个内置,你知道!

class TestStuff(unittest.TestCase):
    @patch('builtins.input', return_value='yes')
    @patch('builtins.print')
    def test_output(self, new_print, new_input):
        # the mocked functions are passed in opposite order
        # to where they're decorated
        main()
        new_print.assert_called_with("We are being attacked! Attack Back!")

如果装饰师很吓人,你甚至可以:

class TestStuff(unittest.TestCase):
    def test_output(self):
        with patch('builtins.input', return_value='yes'), \
             patch('builtins.print') as new_print:
            main()
            new_print.assert_called_with("We are being attacked! Attack Back!")
霍鸣
2023-03-14

patch修饰的函数将使用Mock作为附加参数。你需要

@patch('builtins.input', return_value='yes')
def test_output(self, m):

其中第二个参数m将引用调用test\u output时替换inputMock对象。

从pydocunittest.mock下面的补丁

如果patch用作修饰符,并且省略了new,则创建的模拟将作为额外参数传递给修饰函数。

 类似资料:
  • Python3 实例 以下实例通过使用 if...elif...else 语句判断数字是正数、负数或零: 实例(Python 3.0+)# Filename : test.py # author by : www.runoob.com # 用户输入数字 num = float(input("输入一个数字: ")) if num > 0: print("正数") elif num == 0: pri

  • 前面章节中,详细介绍了 3 种形式的条件语句,即 if、if else 和 if elif else,这 3 种条件语句之间可以相互嵌套。 例如,在最简单的 if 语句中嵌套 if else 语句,形式如下: if 表达式 1:     if 表示式 2:         代码块 1     else:         代码块 2 再比如,在 if else 语句中嵌套 if else 语句,形式

  • 目前遇到此语法错误,错误发布在代码下方。 上面的代码,无法找出if语句上的语法错误。错误消息将很快粘贴为注释

  • 这是我在Python中的第一个项目,我刚刚学习了框架。测试模块运行良好,当我做,但当我想执行某个类或方法,如留档中所说,使用: 我得到以下错误: 我运行命令的目录包含(我还尝试将名称更改为),带有和方法都以开头,这里是我在终端上运行的命令: 我在任何地方都找不到类似的问题,知道错误背后的原因以及如何在模块或方法内部运行某个类将是非常好的

  • 问题内容: 我有这样的说法 而且我非常怀疑是否在每次不满足第一个条件()时都执行else块,这可能吗?我在缩进方面做错了吗? 问题答案: 该子句对应于您期望的相同缩进级别。 您看到的问题可能是由于您混合了制表符和空格,所以缩进的表观级别与您的解释器看到的级别不同。 将所有选项卡更改为空格,然后检查问题是否消失。

  • 主要内容:if else 如何判断表达式是否成立前面我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为 顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。 在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码,这称