UnitTest框架:
介绍
概念:unittest是Python自带的一个单元测试框架,用它来做单元测试 自带的框架:不需要单外安装,只要安装了Python,就可以使用
第三方:想要使用需要先安装使用pytest 单元测试框架:主要用来做单元测试,一般单元测试是开发做的
对于测试来说,unittest框架的作用是自动化脚本(用例代码)执行框架 (使用unittest框架来管理运行多个测试用例的)
能够组织多个用例去执行 提供丰富的断言方法(让程序代码代替人工自动的判断结果和实际结果是否相符) 能够生成测试报告
- 4.unitest核心要素(unittest的组成)
TestCase(最核心的模块) TestCase(测试用例),注意这个测试用例是unittest框架组成部分, 不是手工和自动化中我们所说的用例(Test Case) 主要作用:每个TestCase(测试用例)都是一个代码文件,在这个代码文件中 来书写真正的用例代码 TestSuite TestSuite(测试套件),用来管理组装(打包)多个TestCase(测试用例)的 TestRunner TestRunner(测试执行,测试运行),用来执行TestSuite(测试套件)的 TestLoader TestLoader(测试加载),功能是对TestSuite(测试套件)功能的补充,管理 组装(打包)多个TestCase(测试用例)的 Fixture Fixture(测试夹具),书写TestCase(测试用例)代码中,是一个代码结构, 可以在每个方法执行前后都会执行的内容
举例:
登录的测试用例,每个用例中重复的代码就可以卸载Fixture代码结构中,
只写一遍
1.打开浏览器
2.输入网址
UnitTest的组件的使用方法:
TestCase
1、是一个代码文件,在代码文件中,来书写真正的用例代码 2、代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明) 步骤: 1.导包(unittest) 2.自定义测试类,需要继承unittest模块中的TestCase类即可 3.书写测试方法 4.执行用例(方法) 代码: 1.导包(unittest) import unittest 2.自定义测试类,需要继承unittest模块中的TestCase类即可 class TestDemo(unittest.TestCase) 3.书写测试方法,即用例代码,目前没有真正的用例代码,使用print代替 # 书写要求,测试方法,必须以test_开头(本质是以test开头) def test_mothod1(self): print(‘测试方法1’) def test_mothod2(self): print(‘测试方法2’) 4.执行用例(方法) 4.1 将光标放在类名的后边运行,会执行类中的所有的测试方法 4.2 将光标放在方法名的后边运行,只执行当前的方法
代码实现: testcase1.py
'''
学习TestCase的使用
'''
import unittest
class TestDemo1(unittest.TestCase):
def test_mothod1(self):
print('测试方法1')
def test_mothod2(self):
print('测试方法2')
testcase2.py
'''
学习TestCase的使用
'''
import unittest
class TestDemo2(unittest.TestCase):
def test_mothod3(self):
print('测试方法3')
def test_mothod4(self):
print('测试方法4')
代码书写常见的错误 问题1:代码文件的命名不规范 1.代码文件的名字以数字开头 2.代码文件名字中有空格 3.代码文件名字有中文 4.其他的特殊符号 解决方法:文件名采用(数字、字母、下划线组成、不能以数字开头) 问题2 代码运行没有结果 右键运行没有unitests for的提示,出现的问题 解决方案: 方案1,重新新建一个代码文件,将写好的代码复制进去 方案2,删除已有的运行方式 问题3 没有找到用例 测试方法中不是以test_开头的,或者单词写错了
TestSuite&TestRunner
TestSuite(测试套件):管理 打包 组装 TestCase(测试用例)文件的
TestRunner(测试执行):执行TestSuite(套件)
步骤:
1.导包(unittest)
2.实例化(创建对象)套件对象
3.使用套件对象添加用例方法
4.实例化运行对象
5.使用运行对象去执行套件对象
代码实现 方法1:test_suite1.py
'''
学习 TestSuite和TestRunner的使用
'''
import unittest
from unittest import runner
from testcase1 import TestDemo1
from testcase2 import TestDemo2
suite = unittest.TestSuite()
suite.addTest(TestDemo1('test_mothod1'))
suite.addTest(TestDemo1('test_mothod2'))
suite.addTest(TestDemo2('test_mothod3'))
suite.addTest(TestDemo2('test_mothod4'))
runner = unittest.TextTestRunner()
runner.run(suite)
方法2:test_suite2.py
'''
优化 TestSuite和TestRunner的使用
'''
import unittest
from unittest import runner
from testcase1 import TestDemo1
from testcase2 import TestDemo2
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
runner = unittest.TextTestRunner()
runner.run(suite)
TestLoader
TestLoader(测试加载),作用和TestSuite的作用是一样的。 对TestSuite功能的补充。用例组装测试用例 比如: 如果TestCase的代码文件有很多(10,20,30) 使用步骤 1.导包 2.实例化测试加载对象并添加用例 —>得到的是suite对象 3.实例化运行对象 4.运行对象执行套件对象
代码实现 新建case文件夹,里面放入测试文件 testloader.py
'''
TestLoader的使用
'''
import unittest
from unittest import runner
from unittest import suite
suite = unittest.TestLoader().discover("./case",'hm*.py')
runner = unittest.TextTestRunner()
runner.run(suite)
Fixture
Fixture(测试夹具)是一种代码结构 在某些特定的情况下,会自动执行
- 方法级别
在每个测试方法(用例代码)执行前后都会自动调用的结构
def setup(self):
每个测试方法执行之前都会执行
pass
def teardown(self):
每个测试方法执行之后都会执行
pass
- 类级别
在每个测试类中所有方法执行前后都会自动调用的结构(在整个类中执行之前执行之后执行一次)
类级别的fixture方法,是一个类方法
@classmethod
def setUpClass(cls):
pass
@classmothod
def tearDownClass(cls):
pass
- 模块级别
模块:代码文件 在每个代码文件执行前后执行的代码结构
def setUpModule():
pass
def tearDownModule():
pass
方法级别和类级别的前后的方法,不需要同时出现,根据用例代码的需要自行的选择使用
代码实现 test_Fixture.py
'''
案例
1.打开浏览器(整个测试过程中就打开一次浏览器)类级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同浏览器数据)测试方法
4.关闭当前页面(每个测试方法都需要一次)方法级别
5.关闭浏览器(整个测试过程中就关闭一次浏览器)类级别
'''
import unittest
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
'''每个测试方法执行之前都会先调用的方法'''
print('输入网址...')
def tearDown(self) -> None:
'''每个测试方法执行之后都会先调用的方法'''
print('关闭当前页面...')
@classmethod
def setUpClass(cls) -> None:
print('------1.打开浏览器')
@classmethod
def tearDownClass(cls) -> None:
print('------5.关闭浏览器')
def test_1(self):
print('输入正确用户名密码验证码,点击登录 1')
def test_2(self):
print('输入错误用户名密码验证码,点击登录 2')
|