unitest

●为什么使用UnitTest框架?

1.能够组织多个用例去执行大 2.提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结 果是否相符) 3.能够生成测试报告

●UnitTest核心要素(unitest的组成部分)

  1. TestCase(最核心的模块) TestCase(测试用例),注意这个测试用例是unittest 框架的组成部分,不是手工和自动化中我们所说的用例(Test Case) 主要作用:每个TestCase(测试用例)都是一个代码文件,在这个代码文件中来书写 真正的用例代码
  2. TestSuite TestSuite(测试套件),用来管理组装(打包)多个TestCase(测试用例)的
  3. TestRunner TestRunner(测试执行,测试运行),用来 执行TestSuite (测试套件)的
  4. TestLoader TestLoader(测试加载),功能是对TestSuite( 测试套件)功能的补充,管理组装(打包)多个TestCase(测试用例)的
  5. Fixture Fixture(测试夹具),书写在TestCase(测试用例) 代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容 举例: 登录的测试用例,每个用例中重复的代码就可以写在Fixture 代码结构 中,只写一遍,但每次用例方法的执行,都会执行Fixture 中的代码 1.打开浏览器 2.输入网址

TestCase(测试用例)

1.是一个代码文件,在代码文件中来书写真正的用例代码 2.代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)

  • 步骤 1.导包(unittest) 2.自定义测试类 3.在测试类中书写测试方法 4.执行用例 import unittest class TestDemo1(unittest.TestCase): def test_method1(self):
      print('测试方法1-1')
    
    def test_method2(self):
      print('测试方法1-2')
    

import unittest class TestDemo2(unittest.TestCase): def test_method1(self): print('测试方法2-1') def test_method2(self): print('测试方法2-2')

TestSuite & TestRunner

TestSuite(测试套件):管理打包组装TestCase(测试用例) 文件的 TestRunner(测试执行):执行TestSuite(套件)

  • 步骤 1.导包(unittest) 2.实例化(创建对象)套件对象 3.使用套件对象添加用例方法 4.实例化运行对象 5.使用运行对象去执行套件对象 import unittest

from test1 import TestDemo1 from test2 import TestDemo2 suite = unittest.TestSuite()

方法一:使用套件对象添加用例方法 suite.addTest(TestDemo1('test_method1')) suite.addTest(TestDemo1('test_method2')) suite.addTest(TestDemo2('test_method1')) suite.addTest(TestDemo2('test_method2'))

方法二:使用套件对象添加用例方法 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.运行对象执行套件对象

import unittest

suite=unittest.TestLoader().discover('./case','load*')

suite=unittest.TestLoader().discover('./case','case') runner=unittest.TextTestRunner().run(suite)

Fixture(测试夹具)

Fixture(测试夹具)是一种代码结构,在某些特定的情况下会自动执行

  • 方法级别[掌握] 在每个测试方法(用例代码)执行前后都会自动调用的结构 #方法执行之前 def setup(self): 每个测试方法执行之前都会执行 pass

#方法执行之后 def teardown(self): 每个测试方法执行之后都会执行 pass

  • 类级别[掌握] 在每个测试类中所有方法执行前后都会自动调用的结构(在整个类中执行之前执行之后各一次) #类级别的Fixture方法,是一个类方法 #类中所有方法之前 @classmethod def setupClass(cls): pass

#类中所有方法之后 @classmethod def teardownClass(cls): pass

  • 模块级别了解] 模块:代码文件 在每个代码文件执行前后执行的代码结构 #模块级别的需要写在类的外边直接定义函数即可 #代码文件之前 def setupModule(): pass #代码文件之后 def teardownModule(): pass

断言:让程序代替人工自动的判断预期结果和实际结果是否相符.

断言的结果有两种:

True,用例通过 False, 代码抛出异常,用例不通过 在unittest 中使用断言,都需要通过self.断言方法来试验 assertEqual self.assertEqual(预期结果,实际结果) # 判断预期结果和实际结果是否相等 1.如果相等。用例通过 2.如果不相导,用例不通过,抛出异常 assertIn self.assertIn(预期结果,实际结果)

#判断预期结果是否包含在实际结果中 1.包含,用例通过 2.不包含,用例不通过,抛出异常

import unittest from test1 import login class LoginTest(unittest.TestCase): def test_username_password_right(self): self.assertEqual('登录成功',login('admin','123456')) def test_username_password_error(self): self.assertin('失败', login('root', '123'))

参数化

参数化在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量 好处:相似的代码不需要多次书写. 工作中场景: 1.测试数据一般放在json文件中 2.使用代码读取json文件,提取我们想要的数据--> [(), ()] or [[], []]

  • 安装插件 unittest框架本身是不支持参数化,想要使用参数化,需要安装插件来完成 。联网安装(在cmd窗口安装或者) pip install parameterized pip是Python 中包(插件)的管理工具,使用这个工具下载安装插件 验证 pip list #查看到 parameterized 新建一个python 代码文件,导包验证 from pa... import pa... 或者 from parameterized import parameterized

  • 参数化代码 1.导包unittest/ pa 2.定义测试类 3.书写测试方法(用到的测试数据使用变量代替) 4.组织测试数据并传参(@装饰器) 例子: import unittest from parameterized import parameterized

from test1 import login

数据方法一: data=[ ('admin','123456','登录成功'), ('root', '123456','登录失败') ] 数据方法二: import json def build_data(): with open('logindata.json',encoding='utf-8') as f: result=json.load(f) data = [] for i in result: data.append((i.get('username'),i.get('password'),i.get('expect'))) return data

class TestLogin(unittest.TestCase): @parameterized.expand(data) def testlogin(self,username,password,expect): self.assertEqual(expect,login(username,password))

  • logindata: [ {"desc": "正确用户名和密码", "username": "admin", "password": "123456", "expect": "登录成功"},

    {"desc": "错误用户名和正确密码", "username": "root", "password": "123456", "expect": "登录失败"},

    {"desc": "正确用户名和错误密码", "username": "admin", "password": "123", "expect": "登录失败"},

    {"desc": "错误用户名和错误密码", "username": "root", "password": "123", "expect": "登录失败"}

跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以使用跳过 使用方法,装饰器完成 代码书写在TestCase 文件

#直接将测试函数标记成跳过 @unittest. skip( '跳过额原因' )

#根据条件判断测试函数是否跳过,判断条件成立,跳过 @unittest. skipIf(判断条件,' 跳过原因')

]

JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。