中国做类似 esty的网站,专业建设信息化网站资源,办公室装修设计平台,北京自助建站系统目录 框架#xff1a; unittest框架: 使用的原因: 核心要素(组成):
TestCase测试用例: 可能出现的错误#xff1a; TestSuite(测试套件): TestRunner(测试执行):
整体步骤: 查看执行结果: TestLoader测试加载:
方法级别Fixture:
类级别Fixture: 模块级别Fixture: 用例脚本…目录 框架 unittest框架: 使用的原因: 核心要素(组成):
TestCase测试用例: 可能出现的错误 TestSuite(测试套件): TestRunner(测试执行):
整体步骤: 查看执行结果: TestLoader测试加载:
方法级别Fixture:
类级别Fixture: 模块级别Fixture: 用例脚本包含:
断言常用判断方法: 参数化: 环境准备:
参数化使用
测试报告:
使用绝对路径:
跳过: 框架 framework;为了解决一类事情的功能集合. unittest框架: 是python自带的单元测试框架 --自带的,可以直接使用,不需要单独安装 --测试人员用来做自动化测试,作为自动化测试的执行框架,即管理和执行用例的 使用的原因: 能够组织多个用例去执行;提供丰富的断言方法;能够生产测试报告. 核心要素(组成): TestCase测试用例,这个测试用例是unittest的组成部分,作用是用来书写真正的用例代码(脚本);Testsuite测试套件,作用是用来组装(打包)TestCase(测试用例)的,即可以将多个用例脚本组装到一起;TestRunner测试执行(测试运行),作用是用例执行Testsuite(测试套件)的;Testloader测试加载,是对Testsuite(测试套件)功能的补充,作用是用来组装(打包)TeseCase(测试用例)的;Fixture测试夹具,是一种代码结构,书写前置方法(执行用例之前的方法)代码和后置方法(执行用例之后的方法)代码,即用例执行顺序 前置--用例--后置. TestCase测试用例: 书写真正的用例代码(脚本) 单独一个测试用例也可以执行 步骤: 1.导包unittest; 2.定义测试类,需要继承unittest.TestCase类,习惯性以Test开头; 3.书写测试方法,必须以test开头; 4.执行.注意事项: 1.代码文件名字要满足标识符的规则; 2.代码文件名不要使用中文. 学习TestCase(测试用例)的使用
# 1.导包unittest
import unittest# 2.定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo(unittest.TestCase):# 3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_method1(self):print(测试方法一)def test_method2(self):print(测试方法二)# 4.执行
# 4.1 在类名或者方法名后边右键执行
# 4.1.1 在类名后边,执行类中的所有测试方法
# 4.1.2 在方法名后边,只执行当前测试方法
#
# 4.2 在主程序使用unittest.main()来执行if __name__ __main__:unittest.main()可能出现的错误 1.文件名包含中文; 2.右键运行没有unittest for...... 解决方法:1.新建一个代码文件,将之前的代码复制过来; 2.在主程序是应用unittest.main()来执行: if __name__ __main__: unittest.main() TestSuite(测试套件): 将多条用例脚本集合在一起,就是套件,即用来组装测试用例的 导包 unittest;实例化套件对象 unittest.TestSuite();添加用例方法. TestRunner(测试执行): 用来执行套件对象 导包 unittest;实例化执行对象unittest.TextTestRunner();执行对象执行 套件对象 执行对象.run(套件对象). 整体步骤: 导包 unittest;实例化套件对象unittest.TestSuite();添加用例方法. 3.1 套件对象.addTest(测试类名(测试方法名));或者 3.2 套件对象.addTest(unittest.makeSuite(测试类名)) # 3.2 套件对象.addTest(unittest.makeSuite(测试类名));
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2)) 实例化执行对象 unittest.TextTestRunner();执行对象执行 套件对象 执行对象.run(套件对象). # 导包 unittest;
import unittestfrom Python.unittest.Testcast1 import TestDemo1
from Python.unittest.Testcast2 import TestDemo2# 实例化套件对象unittest.TestSuite();
suite unittest.TestSuite()
# 添加用例方法.
# 3.1 套件对象.addTest(测试类名(测试方法名));
suite.addTest(TestDemo1(test_method1))
suite.addTest(TestDemo1(test_method2))
suite.addTest(TestDemo2(test_method1))
suite.addTest(TestDemo2(test_method2))# 实例化执行对象 unittest.TextTestRunner();
run unittest.TextTestRunner()
# 执行对象执行 套件对象 执行对象.run(套件对象).
run.run(suite)查看执行结果: TestLoader测试加载: 和TestSuite作用一样,组装用例代码,同样也需要使用TextTestRunner()去执行 导包unittest;实例化加载对象并加载用例---得到的是套件对象;实例化执行对象并执行. # 导包unittest;
import unittest# 实例化加载对象并加载用例---得到的是套件对象;
# suite unittest.TestLoader().discover(用例所在的目录,用例代码文件名*.py)
suite unittest.TestLoader().discover(., *case*.py)
# 实例化执行对象并执行
# runner unittest.TextTestRunner
# runner.run(suite)
unittest.TextTestRunner().run(suite)方法级别Fixture: 在每个用例执行前后都会自动调用,方法名是固定的.
def setUp(self): #前置#每个用例执行之前都会自动调用passdef tearDown(self): #后置#每个用例执行之后都会自动调用pass#方法前置 用例 方法后置
#方法前置 用例 方法后置
类级别Fixture: 在类中所有的测试方法执行前后,会自动执行的代码,只执行一次
#类级别的FIxture需要写作类方法
classmethod
def setUpClass(cls): #类前置passclassmethod
def tearDowmClass(cls): #后置pass#类前置 方法前置 用例 方法后置 方法前置 用例 方法后置 类后置模块级别Fixture: 模块,就是代码文件,模块级别,在这个代码文件执行前后执行一次
#在类外部定义函数
def setUpModule():passdef tearDownModule():pass
import unittestclass TestLogin(unittest.TestCase):def setUp(self) - None:print(2.打开网页,点击登录)def tearDown(self) - None:print(4.关闭网页)classmethoddef setUpClass(cls) - None:print(1.打开浏览器)classmethoddef tearDownClass(cls) - None:print(5.关闭浏览器)def test_1(self):print(3.输入用户名密码验证码1,点击登录)def test_2(self):print(3.输入用户名密码验证码2,点击登录)def test_3(self):print(3.输入用户名密码验证码3,点击登录)用例脚本包含: 断言(使用代码自动判断的预期结果和实际结果是否相符);参数化(将测试数据定义到json文件中使用);跳过(某些用例由于某种原因不想执行,设置为跳过);生成测试报告(suite和runner(第三方)). 断言常用判断方法: assertEqual(预期结果,实际结果) ---判断预期结果和实际结果是否相等,如果相等,用例通过,如果不相等,抛出异常,用例不通过assertIn(预期结果,实际结果) ---判断预期结果是否包含在实际结果中,如果存在,用例通过,如果不存在,抛出异常,用例不通过. import unittestclass TestAssert(unittest.TestCase):def test_equal_1(self):self.assertEqual(10, 10) # 用例通过def test_equal_2(self):self.assertEqual(10, 12) # 用例不通过def test_in_1(self):self.assertIn(123, 123123) # 用例通过def tese_in_2(self):self.assertIn(123, 1243) # 用例不通过参数化: ---通过参数的方式来传递数据,从而实现数据和脚本分离,并且可以实现用例的重复执行.(在书写用例方法的时候,测试数据使用变量代替,在执行的时候进行数据传递) --unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展差价parameterized来实现. 环境准备: 因为参数化的插件不是unittest自带的,所以想要使用,需要进行安装; python中包(插件,模块)的安装,使用pip工具 pip install parameterized #在终端(cmd)中执行. 参数化使用 导包 from parameterized import parameterized修改测试方法,将测试方法中的测试数据使用变量显示;组织测试数据,格式[(),(),()],一个元组就是一组测试数据;参数化:在测试方法上方使用装饰器parameterized.expand(测试数据);运行(直接TestCase或者使用suite运行). import unittestfrom Python.unittest.tools import add
from parameterized import parameterizeddata [(1, 1, 2), (1, 2, 3), (2, 3, 5), (4, 5, 9)]class Addtest(unittest.TestCase):parameterized.expand(data)def test_add(self, a, b, expect):print(fa:{a},b:{b},expect:{expect})self.assertEqual(expect, add(a, b))if __name__ __main__:unittest.main测试报告: 使用第三方的报告模板,生成报告,HTMLTestReport,本质是TestRunner --安装 pip install HTMLTestReport --使用 导包unittest,HTMLTestReport;组装用例(套件,loader);使用HTMLTestReport中的runner执行套件;查看报告 import unittestfrom Python.unittest.Testadd import Addtest
from htmltestreport import HTMLTestReport# 套件
suite unittest.TestSuite()
suite.addTest(unittest.makeSuite(Addtest))# 运行对象
# runner HTMLTestReport(报告的文件路径后缀.html,报告的标题,其他的描述信息)
runner HTMLTestReport(test_add_report.html, 加法用例测试报告)
runner.run(suite)使用绝对路径: 将来的项目是分目录书写的,使用相对路径,可能会出现找不到文件的情况,此时需要使用绝对路径. 方法: 在项目的根目录,创建一个python文件(app.py或者config.py);在这个文件中获取项目的目录,在其他代码中使用路径拼接完成绝对路径的书写.获取当前文件的绝对路径:abspath os.path.abspath(__file__);获取文件路径的目录名称:dirname os.path.dirname(filepath). import osBASE_DIR os.path.dirname(__file__)if __name__ __main__:print(BASE_DIR) 跳过: 跳过:对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行(简单来说,不想执行的测试方法,可以设置为跳过) ---直接将测试函数标记成跳过 unittest.skip(跳过的原因) ---根据条件判断测试函数是否跳过 unittest.skipif(判断条件,reason原因) #判断条件为True,执行跳过 import unittestversion 30class Test_skip(unittest.TestCase):unittest.skip(跳过测试)def test_1(self):print(测试方法一)unittest.skipIf(version 30, 版本号大于30,测试方法不执行)def test_2(self):print(测试方法二)def test_3(self):print(测试方法三)