UnitTest是python自带的一个单元测试框架,用它来做单元测试
是一个代码文件,在代码文件中,来书写真正的用例代码
代码文件的名字必须按照标识符的规则来书写
书写步骤
#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、执行用例(方法)
方法一:将光标放在类名的后边运行,会执行类中的所有的测试方法
方法二:将光标放在方法名的后边运行,只执行当前的方法
# 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)
使用步骤:
代码实现:
在一个项目中TestCase的代码,一般放在一个单独的目录中
# 1、导包
import unittest
# 2、实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用*(任意多个任意字符)通配符
suite=unittest.TestLoader().discover(‘./case’,'hm*.py')
# 3、实例化运行对象
runner=unittest.TextTestRunner()
# 4、执行
runner.run(suite)
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')
概念:让程序代替认为判断测试程序的预期结果和实际结果是否相符
断言的结果有两种:
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框架本身不支持参数化,想要使用参数化,需要安装插件来完成
导包
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、组织测试参数并传参(装饰器@)