编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

2022年5月29日学习笔记-基础语法(基础语法知识点)

wxchong 2024-07-07 00:12:22 开源技术 11 ℃ 0 评论


Python学习笔记-基础语法

第十一章 代码测试

  • 一、测试函数
  • 二、测试类

一、测试函数

1、可通过的测试

  • 导入模块unittest来提供代码测试工具
  • 创建一个继承unittest.TestCase()的类,用于包含一系列针对函数的单元测试
  • 使用unittest.main()来让Python运行这个文件中的测试

方法

描述

单元测试

用于核实函数的某个方面没有问题

全覆盖式测试

用例包含一整套单元测试,涵盖了何种可能的函数使用方式

self.assertEqual(A,B)

一种断言方法,将A的值与B相比较并反馈

def get_formatted_name(first,last):
 full_name = first + ' ' + last
 return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
 def test_first_last_name(self):
  formatted_name = get_formatted_name('janis', 'joplin')
  self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
 unittest.main()

输出结果为:
Ran 1 test in 0.003s
OK

2、不能通过测试

def get_formatted_name(first,middle,last):
 full_name = first + " " + middle + ' '+ last
 return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
 def test_first_last_name(self):
  formatted_name = get_formatted_name('janis', 'joplin')
  self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
 unittest.main()

输出结果为:
Ran 1 test in 0.005s

FAILED (errors=1)

Error
Traceback (most recent call last):
 File "D:\Python_Work\Python学习\Python编程-从入门到实践\测试name_function中的函数.py", line 5, in test_first_last_name
  formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'

3、测试未通过时的做法

  • 检查对函数的修改,找出导致函数行为不符合预期的修改,不要修改测试
def get_formatted_name(first,last,middle=''):
 if middle:
  full_name = first + " " + middle + ' '+ last
 else:
  full_name = first + ' ' + last
 return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
 def test_first_last_name(self):
  formatted_name = get_formatted_name('janis', 'joplin')
  self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
 unittest.main()

输出结果为:
Ran 1 test in 0.002s

Launching unittests with arguments python -m unittest D:/Python_Work/Python学习/Python编程-从入门到实践/测试name_function中的函数.py in D:\Python_Work\Python学习\Python编程-从入门到实践
OK

4、添加新测试

  • 在类中添加一个新方法即可
def get_formatted_name(first,last,middle=''):
 if middle:
  full_name = first + " " + middle + ' '+ last
 else:
  full_name = first + ' ' + last
 return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
 def test_first_last_name(self):
  formatted_name = get_formatted_name('janis', 'joplin')
  self.assertEqual(formatted_name, 'Janis Joplin')
 def test_first_middle_last_name(self):
  formatted_name = get_formatted_name('wolfgang','mozart','amadeus')
  self.assertEqual(formatted_name,'Wolfgang Amadeus Mozart')
if __name__ == '__main__':
 unittest.main()

输出结果为:
Ran 2 tests in 0.003s
OK

二、测试类

1、各种断言方法

  • 只能在继承unittest.TestCase的类中使用这些方法

方法

描述

assertEqual(a,b)

核实 a ==b

assertNotEqual(a,b)

核实 a != b

assertTrue(x)

核实 x 为 True

assertFalse(x)

核实 x 为 False

assertIn(item,list)

核实 item 在 list中

assertNotIn(item,list)

核实 item 不在 list 中

2、一个要测试的类

class AnonySurvey():
 def __init__(self,question):
  self.question = question
  self.responses = []
 def show_question(self):
  print(self.question)
 def store_response(self,new_response):
  self.responses.append(new_response)
 def show_results(self):
  print("Survey results:")
  for response in self.responses:
   print("- " + response)
测试类:
import unittest
from language_survery import AnonySurvey
class TestAnonySurvey(unittest.TestCase):
 def test_store_single_response(self):
  question = input("What language did you first learn to speak?")
  my_survey = AnonySurvey(question)
  my_survey.store_response("English")
  self.assertIn('English',my_survey.responses)
 def test_store_three_responses(self):
  question = input("What language did you first learn to speak?")
  my_survey = AnonySurvey(question)
  responses = ['English','Spanish','Mandarin']
  for response in responses:
   my_survey.store_response(response)
  for response in responses:
   self.assertIn(response,my_survey.responses)
unittest.main()

输出结果为:
Ran 2 tests in 0.000s
OK

3、方法setUp()

  • unittest.TestCase()类包含方法setUp(),Python将运行之,创建一次对象,再运行各个以test_打头的方法
class AnonySurvey():
 def __init__(self,question):
  self.question = question
  self.responses = []
 def show_question(self):
  print(self.question)
 def store_response(self,new_response):
  self.responses.append(new_response)
 def show_results(self):
  print("Survey results:")
  for response in self.responses:
   print("- " + response)
import unittest
from language_survery import AnonySurvey
class TestAnonySurvey(unittest.TestCase):
 def setUp(self):
  question = "What language did you first learn to speak?"
  self.my_survey = AnonySurvey(question)
  self.responses = ['English','Spanish','Mandarin']
 def test_store_single_response(self):
  self.my_survey.store_response(self.responses[0])
  self.assertIn(self.responses[0],self.my_survey.responses)
 def test_store_three_responses(self):
  for response in self.responses:
   self.my_survey.store_response(response)
 for response in self.responses:
   self.assertIn(response,self.my_survey.responses)
if __name__ == '__main__':
 unittest.main()

输出结果为:
Ran 2 tests in 0.002s
OK
  • 方法setUp()做了两件事:创建一个调查对象,创建一个答案列表;存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用。
  • 测试自己编写的类时,方法setUp()让测试方法编写起来更容易:可在setUp()方法中创建一系列实例并设置它们的属性,再在测试方法中直接使用这些事例。相比于在每个测试方法中都创建实例并设置其属性要容易得多。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表