python测试用户输入和输出

时间:2018-11-28 05:02:45

标签: python unit-testing io

如何测试此函数,该函数接受一个整数列表,并返回通过恰好相加四个整数而获得的最小值,并返回通过恰好相加四个整数而再次获得的最大值(该函数运行良好) 。我将不胜感激。

def miniMaxSum(arr):
  x = sum(arr)
  print( (x-(max(arr))), (x-(min(arr))) )

if __name__ == '__main__':
  arr = list(map(int, input().rstrip().split()))

  miniMaxSum(arr)

1 个答案:

答案 0 :(得分:0)

您的代码很难测试,因为您混合了计算和交互(在这种情况下为I / O操作)。例如,您的函数miniMaxSum执行a)一些计算并b)打印结果。同样,您的main a)将字符串转换为整数列表,b)执行输入操作。这使得使用自动化测试套件很难对这两个部分进行测试:您可以创建单元测试,但这需要您为I / O部分创建一些测试双打。

如果您清楚地将计算和交互分开,代码可能如下所示:

def miniMaxSum(arr):
  x = sum(arr)
  return ( (x-(max(arr))), (x-(min(arr))) )

def inputStringToNumbers(inputString):
  token = inputString.rstrip().split()
  numbers = list(map(int, token))
  return numbers

if __name__ == '__main__':
  inputString = input()
  numbers = inputStringToNumbers(inputString)
  mini, maxi = miniMaxSum(numbers)
  print(mini, maxi)

然后,您可以非常轻松地为两个功能miniMaxSuminputStringToNumbers创建测试,例如:

import miniMaxSum
import unittest

class TestMiniMaxSum(unittest.TestCase):

    def test_miniMaxSum_withOneElementList_shallGiveZeroes(self):
        actualResult = miniMaxSum.miniMaxSum([42])
        self.assertTupleEqual((0,0), actualResult)

    def test_miniMaxSum_withAandB_shallGiveAandB(self):
        actualResult = miniMaxSum.miniMaxSum([42,56])
        self.assertTupleEqual((42,56), actualResult)

    def test_inputStringToNumbers_withEmptyString_shallGiveEmptyList(self):
        actualResult = miniMaxSum.inputStringToNumbers("")
        self.assertListEqual([], actualResult)

    def test_inputStringToNumbers_withOneNumberStringt_shallGiveOneIntList(self):
        actualResult = miniMaxSum.inputStringToNumbers("42")
        self.assertListEqual([42], actualResult)

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