【问题标题】:Python unit test for nested if statement嵌套 if 语句的 Python 单元测试
【发布时间】:2014-09-05 01:08:51
【问题描述】:

所以我一直在发布单元测试问题,因为我正在努力解决这些问题。我会尽量说清楚。下面我有一个嵌套的 if 语句,我想模拟 difficulty 变量的输入,并在满足条件时检查标准输出。

这是我的运行代码..

def main():
    print("''''''''''''''''''''''''''''''''''''")
    print("''''''''''''''''''''''''''''''''''''")
    print("''' \t\t\t\t '''")
    print("''' \t\t\t\t '''")
    print("''' \t   Pirate Games\t\t '''")
    print("''' \tStart a new game?\t '''")
    print("''' \t\t\t\t '''")
    print("''' \t\t\t\t '''")
    print("''''''''''''''''''''''''''''''''''''")
    print("''''''''''''''''''''''''''''''''''''")

    newGame = input("").lower()

    if newGame == "yes" or "y":

        print("1.Scallywag\n2.Crew\n3.Pirate")
        difficulty = input("Choose ye toughness!")

        if difficulty == "1":
            print("TEST")

    elif newGame == "no" or "n":
        print("Goodbye! Come Again")

    else:
        print("Enter correct input!")

现在这是我的单元测试,但这仅适用于第一个 If 语句,它工作正常。我不知道如何去做第二个。任何帮助表示赞赏,提前谢谢大家。

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,m):
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          main()
          output = out.getvalue().strip()
          self.assertEqual(output, "1.Scallywag\n2.Crew\n3.Pirate")
      finally:
          sys.stdout = saved_stdout


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

【问题讨论】:

  • 如果您运行的是 3.4,contextlib.redirect_stdout 是一种更简洁的重定向标准输出的方式——不再尝试/最终变得丑陋。即使您使用的是 3.3,如果您发现自己在这样的测试中经常这样做,您可能希望将这样的上下文管理器添加到您的工具箱中。

标签: python unit-testing if-statement nested


【解决方案1】:

您可以使用patchside_effect 参数使input 第一次调用时返回"yes",第二次调用"1"

class GetInputTest(unittest.TestCase):

  @patch('builtins.input', side_effect=["yes", "1"])
  def test_output(self,m):
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          main()
          output = out.getvalue().strip()
          # Make sure TEST appears at the end, in addition to the original list of items.
          self.assertEqual(output, "1.Scallywag\n2.Crew\n3.Pirate\nTEST")

      finally:
          sys.stdout = saved_stdout

【讨论】:

  • 它有效,但前提是我从一开始就删除了标准输出(所有开始一个新游戏的东西)我怎么能绕过它。
  • @Salce__ 你要么需要调整你的测试用例,只断言你关心的文本在总输出中,而不是测试相等性:self.assertIn("1.Scallywag\n2.Crew\n3.Pirate\nTEST", output),或者重构你的原始代码以便欢迎消息与处理用户输入的代码位于单独的函数中。然后你可以只是测试用户输入处理函数。
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多