UnitTest框架

UnitTest框架


文章目录

  • UnitTest框架
  • 一、介绍
    • UnitTest核心要素(unittest的组成)
  • 二、TestCase测试用例的书写
  • 三、TestSuite和TestRunner的书写
  • 四、TestLoader和Fixture的使用
    • TestLoader
    • Fixture测试夹具
    • 案例
  • 五、断言的使用
  • 六、参数化的使用


一、介绍

UnitTest是python自带的一个单元测试框架,用它来做单元测试

UnitTest核心要素(unittest的组成)

  • TestCase(最核心的模块)
    每个TestCase都是一个代码文件,在这个代码文件中来书写真正的用例代码;
  • TestSuite
    测试套件,用来管理组装多个TestCase的;
  • TestRunner
    测试执行,用来执行TestSuite;
  • TestLoader
    对TestSuite功能的补充,管理组装(打包)多个TestCase的;
  • Fixture
    测试夹具,书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容;
    举例:
    登录的测试用例,每个用例中重复的代码就可以写在Fixture代码结构中,只写一遍,但每次用例方法的执行,都会执行Fixture中的代码;

二、TestCase测试用例的书写

是一个代码文件,在代码文件中,来书写真正的用例代码
代码文件的名字必须按照标识符的规则来书写

书写步骤

  • 导包(unittest)
  • 自定义测试类
  • 在测试类中书写测试方法
  • 执行用例
#1、导包
import unittest
#2、自定义测试类,需要继承unittest模块中的TestCase类即可
class TestDemo(unittest.TestCase):
	#3、书写测试方法,即用例代码,目前没有真正的用例代码,使用print代替
	# 书写要求,测试方法必须以test_开头
	def test_method1(self):
		print('测试方法 1')
		
	def test_method2(self):
		print('测试方法 2')
#4、执行用例(方法)
方法一:将光标放在类名的后边运行,会执行类中的所有的测试方法
方法二:将光标放在方法名的后边运行,只执行当前的方法

三、TestSuite和TestRunner的书写

# 1、导包
import unittest
# 2、实例化(创建对象)套件对象
from hm_07_testcase1 import TestDemo1
from hm_07_testcase2 import TestDemo2

suite=unittest.TestSuite()
# 3、使用套件对象添加用例方法
# 方式一:套件对象.addTest(测试类名('方法名'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
# 方式二:将一个测试类中的所有方法进行添加
# 套件对象.addTest(unittest.makeSuite(测试类名))
# 缺点:makeSuite()不会提示

# 4、实例化运行对象
runner=unittest.TextTestRunner()
# 5、使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

四、TestLoader和Fixture的使用

TestLoader

使用步骤:

  • 导包
  • 实例化测试加载对象并添加用例
  • 实例化运行对象
  • 运行对象执行套件对象

代码实现:
在一个项目中TestCase的代码,一般放在一个单独的目录中

# 1、导包
import unittest
# 2、实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用*(任意多个任意字符)通配符
suite=unittest.TestLoader().discover(‘./case’,'hm*.py')
# 3、实例化运行对象
runner=unittest.TextTestRunner()
# 4、执行
runner.run(suite)

Fixture测试夹具

Fixture是一种代码结构,在某些特定的情况下会自动执行

  • 方法级别
在每个测试方法(用例代码)之前前后都会自动调用的结构
# 方法执行之前
def setup(self):
	每个测试方法执行之前都会执行
	pass
# 方法执行之后
def teardown(self):
	每个测试方法执行之后都会执行
	pass
  • 类级别
在每个测试类中所有方法执行前后都会自动调用的结构
# 类级别的Fixture方法,是一个类方法
# 类中所有方法之前
@classmethod
def setUpClass(cls):
	pass
#类中所有方法之后
def teardownClass(cls):
	pass
  • 模块级别
模块:代码文件
在每个代码文件执行前后执行的代码结构
# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setUpModule():
	pass
# 代码文件之后
def teardownModule():
	pass

方法级别和类级别的前后的方法,不需要同时出现,根据用例代码的需要自行的选择使用

案例

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')

五、断言的使用

概念:让程序代替认为判断测试程序的预期结果和实际结果是否相符

断言的结果有两种:

  • True:用例通过
  • False:代码抛出异常,用例不通过
    UnitTest框架_第1张图片
    UnitTest框架_第2张图片
    在unittest中使用断言都需要通过self.断言方法来试验
import unittest

class TestLogin(unittest.TestCase):
	def test_username_password_ok(self):
		self.assertEqual('登录成功',login('root','123456'))
	
	def test_username_error(self):
		self.assertEqual('登录失败',login('root','123456'))

六、参数化的使用

使用变量来代替具体的测试数据,使用传参的方法将测试数据传递给方法的变量

工作中场景:
1、测试数据一般放在json文件中;
2、使用代码读取json文件,提取我们想要的数据

安装插件
unittest框架本身不支持参数化,想要使用参数化,需要安装插件来完成

  • 联网安装
    pip install parameterized

导包
from parameterized import pa

参数化代码

# 1、导包 unittest/ pa
import unittest
from parameterized import pa
#组织测试数据[(),(),()] or [[],[],[]]
data=[
	('admin','123456','登录成功'),
	('root','123456','登录失败'),
	('admin','123123','登录失败')
]
# 2、定义测试类
class TestLogin(unittest.TestCase):
# 3、书写测试方法(用到的测试数据使用变量代替)
	@parameterized.expand(data)
	def test_login(self,usename.password,expect):
		self.assertEqual(expect,login(username,password))
# 4、组织测试参数并传参(装饰器@)

你可能感兴趣的:(单元测试,python,开发语言)