0

我已经用 Python 编程了一个月,但我从来没有写过测试用例。我正在尝试为以下程序的测试决定编写 2 个测试集:

#!/usr/bin/python3

def books():
    a = input("Enter number of books:")
    inp = int(a)
    if inp==0:
        print("You earned 0 points")
    elif inp==1:
        print("You earned 5 points")
    elif inp==2:
        print("You earned 15 points")
    elif inp==3:
        print("You earned 30 points")
    elif inp==4:
        print("You earned 60 points")
    else:
        print("No Negatives")

books()

如何编写 2 个测试集来测试该程序的决定?谢谢!

4

2 回答 2

0

听起来您正在寻找一个测试示例。我会通过说这是在 Python 2.7 中完成的,但我相信它也可以在 3 中工作(我所做的只是将 print 语句更改为一个函数 - 不确定其余的是否有效:))。我对您的代码进行了一些编辑(正如 cdarke 所提到的,有更简单的方法来设置点数,但我会保持它接近您的原始代码,以便您可以看到测试它可以采取的步骤)。这是您的代码,有一些修改(注释):

def Books(num_books):
    # We let books take a parameter so that we can test it with different
    # input values.
    try:
      # Convert to int and then choose your response
      num_books = int(num_books)
      if num_books < 0:
          response = "No Negatives"
      elif num_books == 0:
          response = "You earned 0 points"
      elif num_books == 1:
          response = "You earned 5 points"
      elif num_books == 2:
          response = "You earned 15 points"
      elif num_books == 3:
          response = "You earned 30 points"
      elif num_books == 4:
          response = "You earned 60 points"
      else:
          response = "That's a lot of books"

    except ValueError:
        # This could be handled in a better way, but this lets you handle
        # the case when a user enters a non-number (and lets you test the
        # exception)
        raise ValueError("Please enter a number.")

    return response


def main():
    # Here we wrap the main code in the main function to prevent it from
    # executing when it is imported (which is what happens in the test case)

    # Get the input from the user here - this way you can bypass entering a
    # number in your tests.
    a = input("Enter number of books: ")

    # Print the result
    print(Books(a))


if __name__ == '__main__':
    main()

然后是测试,您可以简单地运行为python my_program_test.py

import my_program
import unittest

class MyProgramTest(unittest.TestCase):

  def testBooks(self):
      # The results you know you want
      correct_results = {
          0: "You earned 0 points",
          1: "You earned 5 points",
          2: "You earned 15 points",
          3: "You earned 30 points",
          4: "You earned 60 points",
          5: "That's a lot of books"
          }

      # Now iterate through the dict, verifying that you get what you expect
      for num, value in correct_results.iteritems():
          self.assertEqual(my_program.Books(num), value)


  def testNegatives(self):
      # Test a negative number to ensure you get the right response
      num = -3
      self.assertEqual(my_program.Books(num), "No Negatives")


  def testNumbersOnly(self):
      # This is kind of forced in there, but this tests to make sure that
      # the proper exception is raised when a non-number is entered
      non_number = "Not a number"
      self.assertRaises(ValueError, my_program.Books, non_number)

if __name__ == '__main__':
    unittest.main()
于 2012-10-05T05:06:30.027 回答
0

问题的第二个版本的编辑:

def books(): 

    points = [0,5,15,30,60];    #  list of the points
    inp = 0;

    while inp < 0 or inp >= len(points):
        a = input("Enter number of books:") 
        inp = int(a)

    print("You earned",points[inp],"points") 

books() 

如果书籍数量和点数之间存在直接相关性,您将能够避免该列表,但我不知道您的算法。

如果值inp是字符串,那么您可以使用字典而不是列表。

于 2012-10-05T04:07:02.430 回答