前言:
unittest以一种面向对象的方式产生了一些很重要的概念,如果没有面向对象基础,请补充python面向对象知识
unittest简介
unittest是Python单元测试框架,类似于Java的JUnit框架。以下是unittest官方文档demo,
这是对三个字符串方法(upper、isupper、split)进行单元测试的简短脚本:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
运行结果:3个测试用例运行成功,用例运行结果为pass
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
unittest不仅能够支持简单的单元测试和复杂的功能测试, 还可以用来做等UI自动化测试、接口自动化测试
unittest的意义:
少数的自动化测试用例维护起来看起来是很容易的,但随着项目不断更新迭代,测试套件将持续的增长,测试用例脚本也将变得越来越臃肿庞大,所以我们需要用到一些测试框架对用例的管理和维护。
1.灵活的组织管理自动化用例、冒烟测试用例
2.让用例高效的执行 :可以批量运行大量用例,选中部分用例运行
3.用例的断言:方便验证测试用例的结果
4.测试报告:自动生成html形式测试报告
unittest基础语法规则:
1.一个用例class继承unittest.TestCase类,用例类里面的方法即是一个个具体的测试用例TestCase
类方法名称必须以 test 开头,否则是不被unittest识别成用例
类的名称可以不以test开头
# @Author : 一诺教育
# @File : 0728
import unittest
class YiNuo(unittest.TestCase):
'''
YiNuo:代表用例类的名称,继承了unittest.TestCase类
'''
def testcase01(self):
print('方法名称test开头,代表自动化测试用例1')
def testcase02(self):
print('方法名称test开头,代表自动化测试用例2')
def yinuocase03(self):
print('方法名称yinuo开头,代表非自动化测试用例')
if __name__ == '__main__':
unittest.main(verbosity=2) #main方法运行YiNuo类中所有的测试用例(以test开头的函数)
运行结果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
testcase01和testcase02名称以test开头代表测试用例,yinuocase03非测试用例
2.unittest运行机制
a.运行当前文件所有用例
unittest.main()方法会运行当前py文件中,所有继承了unittest.TestCase的类里面的用例
比如当前文件有俩个类,都继承了unittest.TestCase,则会运行所有俩个类里面的以test开头的用例,示例代码如下所示:
b.运行当前py文件部分用例:
TestSuite:这个类代表一个测试用例或测试套件的集合
addTest(addTests):把TestCase和TestSuite中给的所有的测试实例添加到套件中。
TextTestRunner:一个基础的测试执行器,实现了将结果输出为流的功能。
run:该方法是TextTestRunner主要公共接口,该方法需要一个TestSuite或者TestCase实例作为参数
# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class TestCase1(unittest.TestCase):
def testcase01(self):
print('这是项目1的自动化测试用例1')
def testcase02(self):
print('这是项目1的自动化测试用例2')
class TestCase2(unittest.TestCase):
def testcase01(self):
print('这是项目2的自动化测试用例1')
if __name__ == '__main__':
#创建一个测试套件testcases
testcases = unittest.TestSuite()
#往测试套件添加测试用例TestYiNuo
testcases.addTests([TestCase1('testcase02'),TestCase2('testcase01')])
runner=unittest.TextTestRunner()
runner.run(testcases)
以上套件只添加了项目1的用例2,项目2的用例1,所以只会执行俩个用例,运行结果如下:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
这是项目1的自动化测试用例2
这是项目2的自动化测试用例1
c.运行多个py文件以及多个类的测试用例:
当用例越来越多的时候,肯定会分多个py文件写用例,比如一个模块的用例会放到一个py文件。
如果想要在多个py文件选择用例运行,
TestLoader:经常用来从类和模块中提取创建测试套件,TestLoader对象具有以下方法:
loadTestsFromTestCase(testCaseClass) ,此用法可以同时测试多个类,如果运行其它py文件的用例类,只需要将该类import,然后添加到测试套件中去
# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class TestCase1(unittest.TestCase):
def testcase01(self):
print('这是项目1的自动化测试用例1')
def testcase02(self):
print('这是项目1的自动化测试用例2')
class TestCase2(unittest.TestCase):
def testcase01(self):
print('这是项目2的自动化测试用例1')
if __name__ == '__main__':
#创建一个测试套件testcases
testcases = unittest.TestSuite()
#往测试套件添加TestCase1用例类
testcases.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCase1))
#往测试套件添加TestCase2用例类
testcases.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCase2))
#运行测试套件
runner=unittest.TextTestRunner()
runner.run(testcases)
loadTestsFromName(文件名.类名称.方法名称) :
if __name__ == '__main__':
#创建一个测试套件testcases
testcases = unittest.TestSuite()
#往测试套件添加测试用例
testcases.addTests(unittest.TestLoader().loadTestsFromNames
(['0728.TestCase1.testcase01','0728.TestCase1.testcase02']))
#运行测试套件
runner=unittest.TextTestRunner()
runner.run(testcases)
0728当前py文件的文件名称
3.每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E
4.verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。
5.用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境
setUp():用例执行之前的前置操作,有多少个用例就会执行多少次
tearDown():用例执行之后的后置操作,有多少个用例就会执行多少次
# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class YiNuo(unittest.TestCase):
'''
YiNuo:代表用例类的名称,继承了unittest.TestCase类
'''
def setUp(self) -> None:
'''
这是每个用例的前置,有多少个用例就执行多少次
例如:每个用例执行单独打开一次浏览器
:return:
'''
self.driver=webdriver.Chrome()
print('这是每个用例的前置')
def tearDown(self) -> None:
'''
这是每个用例的后置,有多少个用例就执行多少次
例如:每个用例执行完成就关闭浏览器
:return:
'''
self.driver.close()
print('这是每个用例的后置')
setUpClass:所有用例执行之前的前置操作,仅执行一次
tearDownClass:所有用例执行之前的后置操作,仅执行一次
注意:需要加@classmethod装饰器,代码如下所示:
# @Author : 一诺教育
# @File : 0728
import unittest
from selenium import webdriver
class YiNuo(unittest.TestCase):
'''
YiNuo:代表用例类的名称,继承了unittest.TestCase类
'''
@classmethod
def setUpClass(self) -> None:
'''这是所有用例的后置,有多少个用例就执行多少次。
例如:所有用例共用一个浏览器,只登录一次'''
self.driver=webdriver.Chrome()
print('这是所有用例的后置')
@classmethod
def tearDownClass(self) -> None:
'''这是所有用例的后置,有多少个用例就执行多少次。
例如:所有用例执行完成,退出浏览器'''
self.driver.quit()
print('这是所有用例的后置')
6.可以用第三方库HTMLTestRunner生成html报告。
1.下载HTMLTestRunner文件,放在当前py文件同级目录,(参数中加stream,可以将报告输出到文件:)
2.导入HTMLTestRunner文件HTMLTestRunner类
3.定义测试报告生成路径
示例代码如下:
# @Author : 一诺教育
import unittest
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
class TestCase1(unittest.TestCase):
def testcase01(self):
print('这是项目1的自动化测试用例1')
def testcase02(self):
print('这是项目1的自动化测试用例2')
if __name__ == '__main__':
#创建一个测试套件testcases
testcases = unittest.TestSuite()
#往测试套件添加测试用例
testcases.addTests(unittest.TestLoader().
loadTestsFromNames(['0728.TestCase1.testcase01']))
#定义测试报告生成的路径:
report_dir='./test_report.html'
#往测试报告写入测试结果,w表示打开文件的方式是“写入”,b表示二进制
file=open(report_dir,'wb')
# 通过HTMLTestRunner运行测试套件
runner = HTMLTestRunner(
title="一诺教育商城项目",
description="自动化用例测试报告",
stream=file,
verbosity=2,
)
runner.run(testcases)
生成html形式自动化测试报告
正在学习软件测试的小伙伴,想学习web/接口自动化测试,测试开发,性能测试,或者想搭建属于自己的一套自动化测试框架。或者正在找工作的朋友可以去B站我的主页清风说测试开发的个人空间_哔哩哔哩_Bilibili看看视频,免费无广告,给大家一些面试题的还包括解题思路,测试思维最重要