Python学习笔记:测试代码

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 11 13:33:17 2020

@author: 86159
"""
# use #%% to create cells;Run current cell(ctrl+enter)
#%%
#测试代码:模块unittest
#运行测试用例时,每完成一个单元测试,Python都打印一个字符:
#测试通过时打印一个句点
#测试引发错误时打印一个E
#测试导致断言失败时打印一个F
#%%
from name_function import get_formatted_name

print("Enter 'q' to quit.")
while True:
    first=input("Please give me your first name:")
    if first.lower()=='q':
        break
    last=input("Please give me your last name:")
    if last.lower()=='q':
        break
    
    formatted_name=get_formatted_name(first,last)
    print("Neatly formatted name:"+formatted_name+'.')
#%%
#针对单个函数的测试
#test_name_function.py
#在每次修改函数后进行测试,看修改后的代码是否依旧能符合要求
#导入模块unittest和要测试的函数get_formatted_name()
import unittest
from name_function import get_formatted_name

#可随便命名,最后看起来与要测试的函数相关,并包含字样Test,这个类必须继承unittest.TestCase类
class NamesTestCase(unittest.TestCase):#这个类,包含一系列针对get_formatted_name()的单元测试
    '''测试name_function.py'''
    #方法名必须以test_打头,这样才会在运行这个程序时自动运行    
    def test_first_last_name(self):#运行test_name_function.py时,所有以test_打头的方法都将自动运行
        '''能否正确处理Janis Joplin这样的姓名'''
        formatted_name=get_formatted_name('janis','joplin')
        self.assertEqual(formatted_name,'Janis Joplin')#断言方法:用来合适得到的结果是否与期望的结果一致

    def test_fml_name(self):
        '''能否正确处理Amy Ladje Smith这样的姓名'''
        formatted_name=get_formatted_name('amy','smith','ladje')
        self.assertEqual(formatted_name,'Amy Ladje Smith')


unittest.main()
'''可通过的测试 输出如下'''
#.    #句点表明有一个测试通过了
#----------------------------------------------------------------------
#Ran 1 test in 0.000s   #指出python运行了一个测试,消耗的时间不到0.001秒
#
#OK         #OK表明该测试用例中的所有单元测试都通过了
#上述输出表明,给定包含名和姓的姓名时,函数get_formatted_name()总是能正确的处理


'''不能通过的测试 输出如下'''
#E     #指出测试用例中有一个单元测试导致了错误
#======================================================================
#ERROR: test_first_last_name (__main__.NamesTestCase)  #ERROR指出发生错误的地方在哪里
#能否正确处理Janis Joplin这样的姓名
#----------------------------------------------------------------------
#Traceback (most recent call last):            #指出具体的错误类型
#  File "<ipython-input-4-6f1b61570d0f>", line 10, in test_first_last_name
#    formatted_name=get_formatted_name('janis','joplin')
#TypeError: get_formatted_name() missing 1 required positional argument: 'last'
#
#----------------------------------------------------------------------
#Ran 1 test in 0.016s  #运行了一个单元测试
#
#FAILED (errors=1)   #指出整个测试用例都未通过,因为运行该测试用例时发生了一个错误

#此时,不应修改测试,应修复导致测试不能通过的代码
'''测试带有middle name的用例'''
#把函数get_formatted_name()中的middle设置为可选的,这样第一个用例也会成功
#..    #两个成功用例
#----------------------------------------------------------------------
#Ran 2 tests in 0.000s
#
#OK
'''一个失败用例,一个成功用例'''
#把函数get_formatted_name()中的middle设置为普通的形参即可,这样第一个用例就会失败
#E.    #第一个用例失败,第二个用例成功
#======================================================================
#ERROR: test_first_last_name (__main__.NamesTestCase)
#能否正确处理Janis Joplin这样的姓名
#----------------------------------------------------------------------
#Traceback (most recent call last):
#  File "<ipython-input-7-893b1b474807>", line 10, in test_first_last_name
#    formatted_name=get_formatted_name('janis','joplin')
#TypeError: get_formatted_name() missing 1 required positional argument: 'middle'
#
#----------------------------------------------------------------------
#Ran 2 tests in 0.000s
#
#FAILED (errors=1)
#%%
from survey import AnonymousSurvey as ASy

#定义一个问题,并创建一个表示调查的AnonymousSurvey对象
question="What language did you first learn to speak?"
my_survey=ASy(question)#创建一个AnonymousSurvey类实例

#显示问题并存储答案
my_survey.show_question()
print("Enter 'q' to quit.")
while True:
    response=input("Language:")
    if response.lower()=='q':
        break
    else:
        my_survey.store_response(response)

#显示调查结果
my_survey.show_results()
#%%
#针对类的测试
import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
        '''针对AnonymousSurvey类的测试'''
        
        def test_store_single_response(self):
            '''测试单个答案会被妥善的存储'''
            question="What language did you first learn to speak?"
            my_survey=AnonymousSurvey(question)
            my_survey.store_response('English')
            
            self.assertIn('English',my_survey.responses)
            
        def test_store_three_responses(self):
            '''测试单个答案会被妥善的存储'''
            question="What language did you first learn to speak?"
            my_survey=AnonymousSurvey(question)
            responses=['Englis','Chinese','Japanese']
            for response in responses:
                my_survey.store_response(response)
            
            for response in responses:
                self.assertIn(response,my_survey.responses)
            
unittest.main()
#%%
#方法setUp():只需创建这些对象一次,并在每个测试方法中使用它们
#前面的测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案
#若在TestCase中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法
#在编写的每个测试方法中都可以使用在方法setUp()中创建的对象
#测试自己编写的类时,方法setUp()让测试方法编写起来更容易:可在setUp()方法中创建一系列实例并设置它们的属性,再在测试方法中直接使用这些实例
import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
        '''针对AnonymousSurvey类的测试'''
        
        def setUp(self):
            '''
            创建一个调查对象和一组答案,供使用的测试方法使用
            '''
            question="What language did you first learn to speak?"
            #调查对象和答案列表,存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用
            self.my_survey=AnonymousSurvey(question)
            self.responses=['Englis','Chinese','Japanese']#与self.my_survey.responses不是同一个东西
            
        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:
                my_survey.store_response(response)
            
            for response in self.responses:
                self.assertIn(response,my_survey.responses)
            
unittest.main()

name_function.py

def get_formatted_name(first,last,middle=""):#将中间名设置成可选的
    '''组合成全名'''
    if middle:
        full_name=first+' '+middle+' '+last
    else:
        full_name=first+' '+last
    return full_name.title()

 survey.py

class AnonymousSurvey():
    '''收集匿名调查问卷的答案'''
    
    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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值