python之测试类

简介: python之测试类

各种断言方法:

python在unittest.TestCase类中提供了很多断言的方法,前面说过,断言方法是用来检验该满足的条件是否得到满足,如果该条件确实得到了满足,那么程序行为的假设就得到了确认,可以确定其中没有错误。如果我们认为应该满足的条件实际上并不满足,python将引发异常。


常见的断言的方法:

使用这些方法可核实返回的值等于或不等于预期的值,返回的值为True或False,以及返回的值在列表中或不在列表中。


只能在继unittest.TestCase的类中使用这些方法,随后来看看如何在测试类时可使用其中之一。

一个要测试的类:

类的测试与函数的测试相似,你所做的大部分工作是测试类中的方法的行为。不过还是存在一些不同之处

举例:

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(f"-{response}")

要创建该类的实例,只需要提供一个问题即可。

为了证明 AnonymousSurvey类能够正确工作,编写一个使用它的程序:

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(f"-{response}")


language_survey.py

from test_name_function import AnonymousSurvey
question="你会那些语言?"
my_survey=AnonymousSurvey(question)
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
    response=input("lanuage:")
    if response=='q':
        break
    my_survey.store_response(response)
print("\n谢谢你参与到本次调查之中!")
my_survey.show_results()
你会那些语言?
Enter 'q' at any time to quit.
lanuage:汉语
lanuage:法语
lanuage:西班牙语
lanuage:q
谢谢你参与到本次调查之中!
Survey results
-汉语
-法语
-西班牙语

测试 AnonymousSurvey类:

下面编写一个测试,对 AnonymousSurvey类的行为的一个方面进行验证,如果用户面对调查问题只提供一个答案,这个答案被存储起来,现在我们通过使用assertIn()验证该答案确实在答案列表中。

import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
    def test_store_singnle_response(self):#测试的方法
        question="你会哪些语言?"
        my_survey=AnonymousSurvey(question)
        my_survey.store_response('汉语')#传递单独的语言
        self.assertIn('汉语',my_survey.responses)#核实汉语是否在list中
if __name__=='__main__':
    unittest.main()

测试通过!

.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

但如果想实现测试两个及以上的语言是否在其中呢?

具体操作如下:

import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
    def test_store_singnle_response(self):#测试单一语言是否被存储的方法
        question="你会哪些语言?"
        my_survey=AnonymousSurvey(question)
        my_survey.store_response('汉语')#传递单独的语言
        self.assertIn('汉语',my_survey.responses)#核实汉语是否在list中
    def test_store_three_response(self):#测试多个语言是否被存储的方法
        question="你会那些语言?"
        my_survey=AnonymousSurvey(question)
        responses=["英语","汉语","西班牙语"]
        for response in responses:
            my_survey.store_response(response)
        for response in responses:
            self.assertIn(response,my_survey.responses)
if __name__=='__main__':
    unittest.main()
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

两个测试都通过了,但是该测试不够简洁,下面我们用unittest的另一种方法进行改进。

方法setUp():

import unittest#导入测试模块
from test_name_function import AnonymousSurvey#导入测试的类
class TestAnonymousSurvey(unittest.TestCase):#针对TestAnonymousSurvey的测试
    def setUp(self):#在unittest.TestCase类中包含的setUp方法,创建调查对象和答案列表
    #使下面的测试方法不用自主进行对象的创建和答案的生成
        question="你会哪些语言?"
        self.my_survey=AnonymousSurvey(question)
        self.responses=["英语","汉语","西班牙语"]
    def test_store_singnle_response(self):#测试单一语言是否被存储的方法
        self.my_survey.store_response(self.responses[0])
        self.assertIn(self.responses[0],self.my_survey.responses)#核实self.responses[0]是否在list中
    def test_store_three_response(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.000s
OK

注意:运行测试用例时,每完成一个单元测试,Python都打印一个字符,测试通过时打印一个句点,测试引发错误时,打印一个E,而测试导致断言失败时,则打印一个F,这就是你运行测试用例时,在输出的第1行中看到的句点和字符数量各不相同的原因,如果测试用例包含很多单元测试,需要运行很长时间就可以观察这些结果来获悉有多少个测试通过了

相关文章
|
2天前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
13 2
|
2天前
|
算法 Python
【Python篇】Python 类和对象:详细讲解(中篇)
【Python篇】Python 类和对象:详细讲解(中篇)
11 2
|
2天前
|
存储 C++ Python
【Python篇】Python 类和对象:详细讲解(上篇)
【Python篇】Python 类和对象:详细讲解(上篇)
10 2
|
5天前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
12天前
|
前端开发 Python
Python编程的面向对象(二)—类的多态
Python编程的面向对象(二)—类的多态
16 7
|
11天前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
14天前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
15天前
|
Python
python 类中的内置方法
python 类中的内置方法
|
1天前
|
缓存 网络协议 Linux
Python渗透测试之ARP毒化和协议应用
Python渗透测试之ARP毒化和协议应用
|
1天前
|
安全 网络安全 数据安全/隐私保护
Python渗透测试之流量分析:流量嗅探工具编程
Python渗透测试之流量分析:流量嗅探工具编程
10 0