unitTest框架
断言:判断实际结果与预期结果是否相同,类似于验证。
UnitTest框架
-
什么是UnitTest框架?
概念:python自带单元测试框架,用它做单元测试。 ---- 自带的框架:不需要单外安装,就可使用random、json、time 第三方:需要安装再使用(pytest) ----单元测试框架:主要做单元测试,unittest的作用是自动化脚本(用例代码)执行框架,【使用unittest框架来管理运行多个测试用例的】selenium、appium、requests
-
为什么使用UnitTest框架?
1.能够组织多个用例去执行
2.提供丰富的断言方法(让程序代码代替人工判断验证)
3.能够生产测试报告
- UnitTest核心要素(组成)
1.testcase【最核心的模块】
测试用例,是这个框架的组成部分,不是我们所用的测试用例
主要作用:每个testcase都是一个代码文件,在这个代码中来书写真正的用例代码
2.testSuite
测试套件,用来管理(打包)多个testcase(测试用例)的
3.TestRunner
测试执行,测试运行,用来执行testSuite【测试套件】
4.TestLoader
测试加载,功能是对testSuite测试套件功能的补充,管理组装打包多个Testcase【测试用例】的
5.Fixture
测试夹具,书写在TestCase测试用例代码中,是一个代码结构,可以在每个方法执行后都会执行的内容
举例:
登录的测试用例
1.打开浏览器
2.输入网址
前面1,2条是必须要做的,可以把这两条放进fixture代码结构中,就不需要每次都在testcase书写
TestCase(测试用例)
-
步骤
1.导包(unittest) 2.自定义测试类 3.在测试类中书写测试方法 4.执行用例
-
代码
"""
学习测试用例模块的方法
"""
# 1.导包
import unittest
# 2.自定义测试类,需要继承testcase类
class TestDemo (unittest.TestCase):
#3.书写测试方法,目前没有真正的用例代码,用print代替
#测试方法必须要以test_开头
def test_method1(self):
print("测试方法1")
def test_method2(self):
print("测试方法2")
# 4.执行测试方法(测试用例)
#将光标放在类名后面运行代表运行整个类里面的所有代码
#将光标放在方法名后面运行代表运行该方法里面的代码
TestSuite(测试套件)和TestRunner(测试执行)
-
步骤
1.导包(unitcase) 2.实例化(创建对象)套件对象 3.使用套件对象添加用例方法 4.实例化运行对象 5.使用运行对象去执行套件对象
-
代码
# 1.导包(unitcase) import unittest from day05.hm_02_TestCase1 import TestDemo1 from day05.hm_03_TestCase2 import TestDemo2 # 2.实例化(创建对象)套件对象 suite=unittest.TestSuite() # 3.使用套件对象添加用例方法 #方式一 ,套件对象.addTest(测试类名(‘方法名'))#建议测试类名和方法名直接去复制不要手写 suite.addTest(TestDemo1('test_method1')) suite.addTest(TestDemo1('test_method2')) suite.addTest(TestDemo2('test_method22')) suite.addTest(TestDemo2('test_method20')) #方式二 直接将整个类里面的测试方法一起加进去 #套件对象.addTest(unittest.makeSuite(类名)) suite.addTest(unittest.makeSuite(TestDemo1)) suite.addTest(unittest.makeSuite(TestDemo2)) # 4.实例化运行对象 runner=unittest.TextTestRunner() # 5.使用运行对象去执行套件对象 #运行对象.run(套件对象) runner.run(suite)
登录案例1
#导包
import unittest
from day05.login import login
#自定义测试类
class TestDemo(unittest.TestCase):
def test_method1(self):
if login('admin',123456)=='登录成功':
print('pass')
else:
print('正确的用户名和密码,登录成功')
def test_method2(self):
if login('root',123456)=='登录失败':
print('pass')
else:
print('错误的用户名,登录失败')
def test_method3(self):
if login('admin',123123)=='登录失败':
print('pass')
else:
print('错误的密码,登录失败')
def test_method4(self):
if login('aaa',123123)=='登录失败':
print('pass')
else:
print('错误的用户名和密码,登录失败')
TestLoader(测试加载)
测试加载,作用和TestSuite得作用是一样得,对TestSuite功能得补充,用来组装测试用例的
比如:测试用例TestCase文件有很多(10,20,30)
步骤:
1.导包
2.实例化测试加载对象并添加用例-----》得到的是suite对象
3.实例化运行对象
4.运行对象执行套件对象[runner.run(文件对象)]
-
代码
# 1.导包 import unittest # 2.实例化测试加载对象并添加用例 #unittest.Testloader().discover("文件路径","用例的文件名字") #文件名字可以使用通配符 # suite=unittest.TestLoader().discover("./case",'hm*.py') suite=unittest.TestLoader().discover("./case",'*.py') # 3.实例化运行对象 runner=unittest.TextTestRunner() # 4.运行对象执行套件对象 runner.run(suite)
FIxture(测试夹具)
是一种代码结构,在某些特定的情况下,会自动执行
-
方法级别
在每个测试方法(用例代码)执行前后都会自动调用的结构
#方法执行之前 def setup(self): 每个测试方法执行之前都会执行 pass 测试方法代码写在这个中间 #方法执行之后 def teardown(self): 每个测试方法之后都会执行 pass
-
类级别
在每个测试类中所有方法执行前后,都会自动调用的结构(在整个类中执行之前执行之后各一次)
#类级别的FixTure方法,是一个类方法 #类中所有方法之前 @classmethod def setupClass(csl): pass #类中所有方法之后 @classmethod def teardownClass(csl): pass
-
模块级别
模块:代码文件 在每个代码文件执行前后执行的代码结构
#模块级别的需要写在类的最外边直接定义函数即可 #代码文件之前 def setupModule(): pass #代码文件之后 def teardownModule(): pass
登录案例2
1.打开浏览器(整个测试过程只需要打开一次浏览器)类级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
5.关闭浏览器(整个测试过程只需要关闭一次浏览器)类级别
--------
1.打开浏览器(整个测试过程只需要打开一次浏览器)类级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
5.关闭浏览器(整个测试过程只需要关闭一次浏览器)类级别
断言
断言结果有两种:
1.true---用例通过
2.false----代码抛出异常,用例不通过
在unnittest框架中,都需要通过self.断言方法来使用
assertEqual
self.arrestEqual (预期结果,实际结果) #判断预期结果和实际结果是否相等
1.如果相等,用例通过
2.如果不相等,用例不通过,抛出异常
arrertlh
self.arrestIn(预期结果,实际结果)# 判断预期结果是否包含在实际结果中
1.包含,用例通过
2.不包含,用例不通过,抛出异常
登录案例3断言
#导包
import unittest
from day05.login import login
#自定义测试类
class TestDemo(unittest.TestCase):
def test_method1(self):
self.assertEqual('登录失败',login('admin',123456))
def test_method2(self):
self.assertEqual('登录失败', login('root', 123456))
def test_method3(self):
self.assertEqual('登录失败', login('admin', 123123))
def test_method4(self):
self.assertEqual('登录失败', login('root', 123123))
参数
参数化
工作中的场景:
1.测试数据一般般在json文件中
2.使用代码读取json文件,提取我们想要的数据----》[(),()]or [[],[]]
安装插件
unittest框架本身不支持参数化,需要安装插件完成
---联网安装
pip install parameterized(cmd或者python终端)
----
pip 是python中包(插件)的管理工具,使用这个工具下载安装插件
参数化代码
1.导包unittest/pa
2.定义测试类
3.书写测试方法(用到的测试数据使用变量代替)
4.组织测试数据并传参
# 1.导包unittest/pa
import unittest
from parameterized import parameterized
from day05.login import login
# 4.组织测试数据并传参
#组织测试数据[(),(),()]
data =[
('admin','123456','登录成功'),
('root','123456','登录失败'),
('admin','123123','登录失败')
]
# 2.定义测试类
class TestLogin(unittest.TestCase):
# 3.书写测试方法(用到的测试数据使用变量代替)
@parameterized.expand(data)#这里进行传参
def test_login(self,username,password,expect):
self.assertEqual(expect, login(username, password))
# 4.组织测试数据并传参
参数化2
在json文件里面写代码,然后进行引入数据
[
{
"desc": "正确的用户名和密码",
"username": "admin",
"password": "123456",
"excpet": "登录成功"
},
{
"desc": "错误的用户名",
"username": "root",
"password": "123456",
"excpet": "登录失败"
},
{
"desc": "错误的密码",
"username": "admin",
"password": "123123",
"excpet": "登录失败"
}
]
# 1.导包unittest/pa
import json
import unittest
from parameterized import parameterized
from day05.login import login
# 4.组织测试数据并传参
#组织测试数据[(),(),()]
def bulid_data():
with open("data.json",encoding='utf-8') as f:
result=json.load(f)
list=[]
for i in result:
list.append((i.get('username'), i.get('password') , i.get('excpet')))
return list
# 2.定义测试类
class TestLogin(unittest.TestCase):
# 3.书写测试方法(用到的测试数据使用变量代替)
@parameterized.expand(bulid_data())#这里进行传参
def test_login(self,username,password,expect):
self.assertEqual(expect, login(username, password))
# 4.组织测试数据并传参
跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以使用跳过使用方法,装饰器完成
代码书写在TestCase文件里面
#直接在测试函数标记成跳过
@unittest.skip('跳过的原因')
#根据条件判断测试函数是否跳过,判断条件成立,跳过
@unittest.skipIf(判断条件,'跳过原因')
import unittest
class TestDemo(unittest.TestCase):
@unittest.skip('没有什么原因,就不想测试1')
def test_method1(self):
print('测试方法1')
def test_method2(self):
print('测试方法2')
def test_method3(self):
print('测试方法3')
测试报告
自带的测试报告
只有单独运行TestCase的代码,才会生成测试报告
第三方测试报告
1.获取第三方的测试运行类模块,将其放在代码的目录中
2.导包unittest
3.使用 套件对象,加载对象 去添加用例方法
4.实例化 第三方的运行对象并运行套件对象
# 1.获取第三方的测试运行类模块,将其放在代码的目录中
# 2.导包unittest
import unittest
from HTMLTestRunner import HTMLTestRunner
# 3.使用 套件对象,加载对象 去添加用例方法
suite=unittest.defaultTestLoader.discover('.','hm_04_pa.py')
# 4.实例化 第三方的运行对象并运行套件对象
HTMLTestRunner()
1.组织用例文件(TestCase里边),书写参数化,书写断言,书写Fixtrue,书写跳过,如果单个测试测试文件,直接运行,得到测试报告,如果有多个测试文件,需要组装运行生成测试报告。
2.使用套件对象组装,或者使用加载对象组装
3.运行对象 运行
3.1 运行对象=第三方的运行类(文件对象(打开文件需要使用wb方式))
3.2 运行对象.run(套件对象)