基于Python+unittest自动化测试框架说明文档

​​ 一、unittest自动化框架介绍…. – 5 –​​

​​1、unittest核心工作原理…. – 5 –​​

​​1.1、TestCase. – 5 –​​

​​1.2、TestSuite. – 6 –​​

​​1.3、TestRunner. – 6 –​​

​​1.4、TestFixture. – 6 –​​

​​2、框架目录结构介绍…. – 6 –​​

​​2.1、config层…. – 6 –​​

​​2.2、data层…. – 7 –​​

​​2.3、log层…. – 7 –​​

​​2.4、report层…. – 7 –​​

​​2.5、test层…. – 7 –​​

​​2.6、utils层…. – 7 –​​

​​2.7、main.py. – 7 –​​

​​2.8、ReadMe.md. – 8 –​​

​​3、自动化框架整体的封装介绍和认识…. – 8 –​​

​​二、测试用例模板设计方案…. – 9 –​​

​​1、单接口测试用例方案…. – 9 –​​

​​1.1、方案一…. – 9 –​​

​​1.2、方案二…. – 10 –​​

​​1.3、方案三…. – 11 –​​

​​1.4、方案四…. – 12 –​​

​​2、组合接口测试用例设计…. – 14 –​​

​​2.1、模板说明…. – 14 –​​

​​三、针对用例模板的test代码编写模板…. – 15 –​​

​​1、单接口代码编写模板…. – 15 –​​

​​1.1、实例化模板解析器…. – 16 –​​

​​1.2、模板数据的解析…. – 16 –​​

​​1.3、setUpClass(cls)中的初始化数据…. – 17 –​​

​​1.4、测试案例说明的取值介绍…. – 17 –​​

​​1.5、解析响应值介绍…. – 17 –​​

​​1.6、断言…. – 18 –​​

​​2、组合接口代码编写模板…. – 20 –​​

​​2.1、实例化模板解析器…. – 21 –​​

​​2.2、模板数据的解析…. – 22 –​​

​​2.3、模板数据的提取…. – 22 –​​

​​2.4、测试案例说明的取值介绍…. – 22 –​​

​​2.5、上下游接口依赖处理…. – 23 –​​

​​2.6、解析响应值介绍…. – 23 –​​

​​2.7、断言…. – 23 –​​

​​3、excel存储用例的单接口编写模板…. – 23 –​​

​​3.1、模块名说明…. – 24 –​​

​​3.2、测试代码编写说明…. – 24 –​​

​​3.3、断言…. – 24 –​​

​​四、项目流程运作介绍…. – 25 –​​

​​1、项目运行流程…. – 25 –​​

​​1.1、获取token. – 25 –​​

​​1.2、令牌全局变量的设定存储…. – 25 –​​

​​1.3、测试用例的编写及存储…. – 25 –​​

​​1.4、测试用例模板的解析及测试代码的编写…. – 25 –​​

​​1.5、用例的匹配与加载…. – 25 –​​

​​1.6、用例执行结果写入报告…. – 25 –​​

​​1.7、发送邮件报告…. – 26 –​​

​​2、后台配置文件的掌控…. – 26 –​​

​​3、报告文件介绍…. – 28 –​​

​​3.1、总览区…. – 28 –​​

​​3.2、详情区…. – 28 –​​

​​3.3、图表区…. – 30 –​​

​​4、邮件与代码的对应区…. – 30 –​​

一、unittest自动化框架介绍

1、unittest核心工作原理

unittest中最核心的四个概念是:test case, test suite, test runner, test fixture。

下面我们分别来解释这四个概念的意思,先来看张unittest的静态类图:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档​编辑

1.1、TestCase

一个TestCase的实例就是一个测试用例。那么什么是测试用例呢?说白了就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。

元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

1.2、TestSuite

多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite,TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

1.3、TestRunner

TestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法,测试的结果会保存到TestResult实例中,包括运行了多少测试用例、成功了多少、失败了多少等信息。

一个class继承了unittest.TestCase,便是一个测试用例,但如果其中有多个以 test开头的方法,那么每有一个这样的方法,在load的时候便会生成一个TestCase实例,如:一个class中有四个test_xxx方法,最后再load到suite中时也有四个测试用例。

1.4、TestFixture

对一个测试用例环境的搭建和销毁,是一个fixture。

2、框架目录结构介绍

搭建的框架大致如下,关于框架的解释说明请看:

ZYL_Project:

├── config (配置文件)

├── data (数据文件)

├── logs (日志文件)

├── report (报告)

├── test (测试用例)

├── utils (公共方法)

├── main.py (入口函数)

└── ReadMe.md (说明性的文件,告诉团队成员框架需要的环境以及用法)

基于Python+unittest自动化测试框架说明文档

2.1、config层

放配置文件,所有项目相关的配置均放到这里,用Python支持较好的配置文件格式如ini或yaml等进行配置,实现配置与代码分离。

2.2、data层

放数据文件,可以把所有的testcase的参数化相关的文件放到这里,一般可采用xlsx、csv、xml等格式,实现数据与代码分离。

这边对用例的类别也用文件夹做了区分:combindata——组合接口测试用例数据、singledata——单接口测试用例数据。

2.3、logs层

所有生成的日志均存放在这里,可将日志分类,如运行时日志test log,错误日志error log等。

2.4、report层

放程序运行生成的报告,一般可有html报告、excel报告等。

2.5、test层

放所有测试相关的文件,如case——测试用例:combincase——组合接口测试用例代码、singlecase——单接口测试用例代码,common——项目相关的抽象通用代码、mock——模拟服务请求代码、interface——socket接口测试。

2.6、utils层

所有的支撑代码都在这里,包括读取config的类、写log的类、读取excel、xml的类、生成报告的类(如HTMLTestRunner)、数据库连接、发送邮件等类和方法,都在这里。

2.7、main.py

    把控整个流程的入口函数,包括获取登录令牌token,将token写入配置文件设置全局变量,加载指定规则的用例,执行用例,写入报告,发送报告等方法。

2.8、ReadMe.md

说明性文件,当前各个版本库及环境的说明:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

3、自动化框架整体的封装介绍和认识

以主控函数为主线,往下展开看项目结构:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

  

二、测试用例模板设计方案

这边设计了四种单接口测试用例模板的设计方案,各有各的优缺点和对比,如果采用yml测试用例模板,个人比较推荐第三种方案,但从低代码的最佳实践模式,我更推荐excel测试用例模板,可以用较少且封装的代码模板完成对测试用例的解析并生成报告,底层我都封装好了,容易入手。

1、单接口测试用例方案

1.1、方案一

# 测试用例模板一

tests:

- case: 验证功能xxx

request:

method: POST

path: /api/test01

headers:

Content-Type: application/x-www-form-urlencoded

params:

a: 1111

b: 2222

expected:

data:

statue: 成功

- case: 验证功能yyy

request:

method: POST

path: /api/test01

headers:

Content-Type: application/x-www-form-urlencoded

params:

a: 3333

b: 4444

expected:

data:

statue: 成功

基于Python+unittest自动化测试框架说明文档

1.1.1、模板说明

tests: 是固定模板名

case: 用例名称,用于说明验证了什么功能

request: 请求数据的集合

method: 请求方法

path: 请求路径

headers: 请求头

params: 请求参数

expected: 期望值,数据结构可以根据实际项目自定义

1.1.2、模板优缺点

优:一条用例对应对应一个case架构,结构清晰。

缺:对于请求方法和请求路径没必要每次都加载,有点冗余。

1.2、方案二

# 测试用例模板2

tests:

request:

method: POST

path: /api/test01

headers:

token: $token

Content-Type: application/x-www-form-urlencoded

params:

a:

- 1111

- 2222

b:

- 3333

- 4444

expected:

- data:

job: 测试工程师

statue: 成功

- data:

statue: 失败

基于Python+unittest自动化测试框架说明文档

1.2.1、模板说明

tests: 是固定模板名

case: 用例名称,用于说明验证了什么功能

request: 请求数据的集合

method: 请求方法

path: 请求路径

headers: 请求头

params: 请求参数

expected: 期望值,数据结构可以根据实际项目自定义

1.2.2、模板优缺点

优:请求方法、请求头、请求路径用一个节点并以数组的形式进行存储,避免多模板子集,请求参数和期望数据也用数组存储,案例按照数组下标一一对应。

缺:对于不同条件情况的请求头,无法区分;功能验证说明体现在测试用例代码中,在用例中体现不出;对于请求参数在测试用例设计模板中体现不出用例的颗粒度。

1.3、方案三

# 测试用例模板三

tests:

common: #公共部分

method: POST

path: /api/test01

testcase:

- case: 验证正常登录后请求数据

request:

headers:

Authorization: $Authorization

Content-Type: application/x-www-form-urlencoded

params:

a: 1111

b: 2222

expected:

data:

job: 测试工程师

statue: 成功

- case: 验证登录后请求数据类型为字母

request:

headers:

Authorization: $Authorization

Content-Type: application/x-www-form-urlencoded

params:

a: aaa

b: bbb

expected:

data:

statue: 失败

基于Python+unittest自动化测试框架说明文档

1.3.1、模板说明

tests: 是固定模板名

case: 用例名称,用于说明验证了什么功能

request: 请求数据的集合

method: 请求方法

path: 请求路径

headers: 请求头

params: 请求参数

expected: 期望值,数据结构可以根据实际项目自定义

1.3.2、模板优缺点

优:结构清晰,一条用例一个case,提取了公共部分的请求路径和请求方法,重点放在请求头,请求参数和期望值的组合用例化。

缺:对于请求路径和请求方法的错误没法单独验证,但是对于请求路径的错误可以自己模拟,体现在用例中的作用意义不大。

1.4、方案四

用excel编写测试用例:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

1.4.1、用例模板说明

用例相关字段的说明和格式要求,请参考下表规范去编写:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

1.4.2、sheet表维度设计

针对sheet表维度设计有两种方案:

方案一、sheet名为模块名,则sheet表中的内容为这个模块的所有接口的所有情况的校验,测试代码名为test_模块名;

方案二、sheet名为接口名,则sheet表中的内容为对这一个接口的所有情况的校验,测试代码名为test_接口名;

综合sheet表的有效利用率和字段的避重复性原则,这边我比较推崇方案一,可以使得测试用例模块化,测试接口多元化。

1.4.3、模板优缺点

优:按excel给出的接口测试用例编写模板,可以对应表头字段去对应swagger接口文档填写对应内容,可以运用等价类、边界值、场景设计法、判定表、因果图、正交法、错误猜测法等方法对用例的参数进行随机组合场景。

不需要会代码就可以做自动化,代码都封装好了,只需要复制模块代码,传入对应的sheet名就可以了。

缺:目前这个模板暂不支持多接口的开发。

2、组合接口测试用例设计

# 测试接口集合用例模板

tests:

- case: 使用正确的数据新增api密钥

request:

method: POST

path: /api/test01

headers:

Content-Type: application/x-www-form-urlencoded

params:

a: aaaa

b: 2222

expected:

data:

apiKey: 222222

statue: 成功

- case: 删除已存在的api密钥

request:

method: POST

path: /api/mockman

headers:

Content-Type: application/x-www-form-urlencoded

params:

name: li

id: $id

expected:

data:

statue: 成功

基于Python+unittest自动化测试框架说明文档

2.1、模板说明

tests: 是固定模板名

case: 用例名称,用于说明验证了什么功能

request: 请求数据的集合

method: 请求方法

path: 请求路径

headers: 请求头

params: 请求参数

expected: 期望值,数据结构可以根据实际项目自定义

这边上下游接口的衔接是通过“$param”的形式进行传参,即上一个的接口的返回值作为下个接口的入参的形式进行,且这边基本不做接口的异常情况案例处理了,因为接口的异常案例在单接口测试中已经校验过了,多接口这边做的更多的是请求成功的接口间的数据流程传递。

三、针对用例模板的test代码编写模板

1、单接口代码编写模板

# 实例化JMESPath抽取器

j = JMESPathExtractor()

# 实例化TEMPLATE模板解析

T = TEMPLATEExtractor()

# 实例化CASE模板解析器

c = CASEExtractor()

# 测试用例的文件路径

data_path = SINGLE_DATA + 'testName.yml'

# 参数关联-获取登录令牌(需要登录接口的处理,若不需要登录,则不需要这部分代码,获取模板数据直接为T.extract(data_path)

Authorization = {'Authorization': str(Config(config=TOKEN_PATH).get('token'))}

# 获取模板数据

t = T.extract(data_path, Authorization)



class Test_03(unittest.TestCase):

''' 测试三用例模板 '''



@classmethod

def setUpClass(cls):

warnings.simplefilter('ignore', ResourceWarning)

print("------------------------------------ 开始执行用例 ------------------------------------")

# 获取请求头

cls.headers = c.get_headers(t, n)

# 获取请求的url

cls.url = T.getUrl3(t)

# 获取请求方法

cls.method = c.get_method(t)

# 请求

cls.client = HTTPClient(cls.url, cls.method, cls.headers)



@classmethod

def tearDownClass(cls):

print("------------------------------------ 用例执行结束 ------------------------------------")



@verificating_case(t, n)

def test_01(self):

""" {0} """

print("n请求地址:%s n请求方法:%s n请求头:%s" % (self.url, self.method, self.headers))

# 测试需要

response = self.client.send(data=c.get_params(t, n))

# 请求成功断言

assertHTTPCode(response, [200])

# 获取返回结果

statue = j.extract(query='data.statue', body=response.text)

# 期望的结果

expect = c.get_expected(t, n)['statue']

# 比较返回结果和期望结果

self.assertEqual(statue, expect)

基于Python+unittest自动化测试框架说明文档

代码模版讲解:

1.1、实例化模板解析器

这些都是我封装好的,可以先实例化后再使用:

# 实例化JMESPath抽取器

j = JMESPathExtractor()

# 实例化TEMPLATE模板解析

T = TEMPLATEExtractor()

# 实例化CASE模板解析器

c = CASEExtractor()

基于Python+unittest自动化测试框架说明文档

1.2、模板数据的解析

data_path就是测试用例的路径,对于数据模板的解析,这边主要分为两种情况:

情况一,不需要登录的接口

对于不需要登录的接口,不修改原模板值的情况下,直接传入模板路径解析

t = T.extract(data_path)

基于Python+unittest自动化测试框架说明文档

情况二、需要登录的接口

测试代码的处理:植入token

Authorization = {'Authorization': str(Config(config=TOKEN_PATH).get('token'))}

t = T.extract(data_path, Authorization)

基于Python+unittest自动化测试框架说明文档

测试用例模板的处理:

request:

headers:

Authorization: $Authorization

基于Python+unittest自动化测试框架说明文档

就是以$key值的形式去引入变量值

1.3、setUpClass(cls)中的初始化数据

以下方法都是封装好的,具体n的取值就是数组的下脚标,对应测试用例模板取数据就可以了:

请求路径:

T.getUrl3(t)

基于Python+unittest自动化测试框架说明文档

请求头:

c.get_headers(t, n)

基于Python+unittest自动化测试框架说明文档

请求方法:

c.get_method(t)

基于Python+unittest自动化测试框架说明文档

请求数据:

c.get_params(t, n)

基于Python+unittest自动化测试框架说明文档

期望数据:

c.get_expected(t, n)

基于Python+unittest自动化测试框架说明文档

1.4、测试案例说明的取值介绍

@verificating_case(t, n)

def test_01(self):

""" {0} """

案例名称:@verificating_case(t, n)

{0}默认都取一个值

基于Python+unittest自动化测试框架说明文档

1.5、解析响应值介绍

j.extract(query='data.node', body=response.text)

基于Python+unittest自动化测试框架说明文档

这个解析器也是封装好的,具体要取哪一层的数据用,对应数组下脚标去取就可以了。

1.6、断言

self.assertEqual({实际的结果}, {期望的结果})

当然这只是一种断言的函数,还有很多种函数

这边有一些关于断言的介绍和总结:

可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

self.assertEqual(a,b,msg=msg) #判断a与.b是否一致,msg类似备注,可以为空

self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致

self.assertTrue(a,msg=none) #判断a是否为True

self.assertFalse(b,msg=none) #判断b是否为false

self.assertAlmostEqual(a,b,places=none,msg=none,delta=none) #该判断过程有点复杂,判断过程如下

注:places与delta不能同时存在,否则出异常

#若a==b,则直接输入正确,不判断下面的过程

#若delta有数,places为空,判断a与b的差的绝对值是否<=delta,满足则正确,否则错误

#若delta为空,places有数,判断b与a的差的绝对值,取小数places位,等于0则正确,否则错误

#若delta为空,places为空,默认赋值places=7判断

例 assertAlmostEqual(2,2) 正确,

assertAlmostEqual(5,2,delta=4) 正确

assertAlmostEqual(5,2,delta=2) 错误

assertAlmostEqual(2,2.005,places=1) 正确

assertAlmostEqual(2,2.05,places=3) 错误

self.assertNotAlmostEqual(a,b,places=none,msg=none,delta=none) 同上,但判断相反

注,delta与places不能同时存在,否则抛出异常

例 assertNotAlmostEqual(2,2) 错误

assertNotAlmostEqual(a,b,delta=c) #a不等于b 同时 a-b>c 则正确,否则错误

assertNotAlmostEqual(a,b,places=2)

#a不等于b 同时|b-a|*0,01 不等于0 则正确,否则错误

self.assertSequenceEqual #有空在研究,源码很长

self.assertListEqual #有空研究

self.assertTupleEqual #有空在研究

self.assertSetEqual #有空在研究

self.assertIn(a,b) 判断a in b是否成立,正确则True,否则为False

例: assertIn(“2” in “23”) 成功

assertIn(“1” in “23”) 失败

self.assertNotIn(a,b) 判断a in b是否成立,不成立则True 否则 False

例:assertIn(“2” in “23”) 失败

assertIn(“1” in “23”) 成功

self.assertIs(a,b) 判断a 与b的对象是否相同,成立则True,否则False

注,判断是否同一对象 id(a) 若id相同,则为同一对象

例 a,b=1,1.0

assertls(a,b) 失败

a,b=1,1

assertls(a,b) 成功

self.assertIsNot(a,b) 判断a 与b的对象是否相同,不成立True,否则False

self.assertDictEqual(a,b) #判断字典a和字典b是否相等,a,b为字典

self.assertDictContainsSubset

self.assertItemsEqual(a,b) #比较两字符串是否一致,同sorted(a)==sorted(b)

注:sorted排序,方法内部为,将a,b分别list,生成各自列表,在sorted排序在比对

self.assertMultiLineEqual(a,b) #比较a文本与b文本是否一致,即便多了个换行,也会区分

self.assertLess(a,b) #判断a

self.assertLessEqual #判断a<=b 成立则通过,否则失败

self.assertGreater #判断a>b 成立则通过,否则失败

self.assertGreaterEqual #判断a>=b 成立则通过,否则失败

self.assertIsNone(obj=””) #判断obj=None 成立则通过,否则失败

self.assertIsNotNone #判断obj=None 成立则失败,否则通过

self.assertIsInstance(a,b) #判断a的数据类型是否为b,isinstance(a,b) 成立则通过,否则失败

self.assertNotIsInstance #判断同上相反

self.assertRaisesRegexp #正则判断匹配,没仔细看,过程复杂

self.assertRegexpMatches(a,b) #正则匹配 同re.search(b,a)匹配有则成功,否则失败

注:a为匹配的正则表达式,必须字符型,b 为要匹配的内容

self.assertNotRegexpMatches #同上,判断相反

基于Python+unittest自动化测试框架说明文档

2、组合接口代码编写模板

# 实例化JMESPath抽取器

j = JMESPathExtractor()

# 实例化TEMPLATE模板解析器

T = TEMPLATEExtractor()

# 实例化组合模板解析器

S = SUITEExtractor()

# 测试用例的文件路径

data_path = COMBIN_DATA + 'testName.yml'

# 获取模板数据

t = T.extract(data_path)

# 用例名

case = S.get_suite(t)



class Test_01c(unittest.TestCase):

''' 测试接口集合用例模板 '''



@classmethod

def setUpClass(cls):

warnings.simplefilter('ignore', ResourceWarning)

print("------------------------------------开始执行用例:%s ------------------------------------ " % case)



@classmethod

def tearDownClass(cls):

print("------------------------------------用例执行结束:%s ------------------------------------" % case)



@verificating_suite(case)

def test(self):

""" {0} """

client = HTTPClient(T.getUrl(x, t), S.get_method(t, n), S.get_headers(t, n))

response = client.send(data=S.get_params(t, n))

statue = j.extract(query='data.statue', body=response.text)

self.assertEqual(statue, S.get_expected(t, n)['statue'])



apiKey = j.extract(query='data.apiKey', body=response.text)

t1 = T.extract(data_path, {'id': apiKey})

client1 = HTTPClient(T.getUrl(x, t1), S.get_method(t1, n), S.get_headers(t1, n))

response1 = client1.send(data=S.get_params(t1, n))

statue = j.extract(query='data.statue', body=response1.text)

self.assertEqual(statue, S.get_expected(t1, n)['statue'])

基于Python+unittest自动化测试框架说明文档

2.1、实例化模板解析器

这些都是我封装好的,用就好了:

# 实例化JMESPath抽取器

j = JMESPathExtractor()

# 实例化TEMPLATE模板解析器

T = TEMPLATEExtractor()

# 实例化组合模板解析器

S = SUITEExtractor()

基于Python+unittest自动化测试框架说明文档

2.2、模板数据的解析

data_path就是测试用例的路径,对于数据模板的解析,这边分为两种情况:

情况一,不需要登录的接口

t = T.extract(data_path)

基于Python+unittest自动化测试框架说明文档

情况二、需要登录的接口

测试代码的处理:植入token

Authorization = {'Authorization': str(Config(config=TOKEN_PATH).get('token'))}

t = T.extract(data_path, Authorization)

基于Python+unittest自动化测试框架说明文档

测试用例模板的处理:

request:

headers:

Authorization: $Authorization

基于Python+unittest自动化测试框架说明文档

就是以$key值的形式去引入变量值

2.3、模板数据的提取

以下方法都是封装好的,具体n的取值就是数组的下脚标,对应测试用例模板取数据就可以了:

请求路径:

T.getUrl(x, t)

基于Python+unittest自动化测试框架说明文档

请求头:

S.get_headers(t, n)

基于Python+unittest自动化测试框架说明文档

请求方法:

S.get_method(t, n)

基于Python+unittest自动化测试框架说明文档

请求数据:

S.get_params(t, n)

基于Python+unittest自动化测试框架说明文档

期望数据:

S.get_expected(t, n)

基于Python+unittest自动化测试框架说明文档

2.4、测试案例说明的取值介绍

@verificating_suite(case)

def test(self):

""" {0} """

案例名称:@verificating_suite(case)

case名可以通过case = S.get_suite(t)来提取组合名称

{0}默认都取一个值

基于Python+unittest自动化测试框架说明文档

2.5、上下游接口依赖处理

如何将上个接口的返回数据传到下个接口作为入参,这边的处理参考登录的处理类似:

apiKey = j.extract(query='data.apiKey', body=response.text)

t1 = T.extract(data_path, {'id': apiKey})

基于Python+unittest自动化测试框架说明文档

2.6、解析响应值介绍

j.extract(query='data.node', body=response.text)

基于Python+unittest自动化测试框架说明文档

这个解析器也是封装好的,具体要取哪一层的数据用取数组下脚标的方式去取就可以了。

2.7、断言

self.assertEqual({实际的结果}, {期望的结果})

基于Python+unittest自动化测试框架说明文档

当然这只是一种断言的函数,还有很多种函数,可以参考上面的总结。

3、excel存储用例的单接口编写模板

SHEET_NAME = "登录"



@docstring_parameter(SHEET_NAME)

class TestCase(unittest.TestCase):

'''{0}'''



@parameterized.expand(getExcelData(TEST_CASE_PATH, SHEET_NAME))

def test_login(self, rowNumber, caseRowNumber, testCaseName, priority, apiName, path, method, parmsType,

data, checkPoint, isRun, result, bugUrl):

if isRun == "Y" or isRun == "y":

headers = {"Content-Type": "application/json;charset=UTF-8"}

# 选择环境拼接url

url = get_url(path)

logger.warning("[开始执行测试用例:{}]".format(testCaseName))

print(

"测试用例编号:%s n测试用例名称:%s n优先级:%s n接口名:%s n请求方法:%s n请求数据类型:%s n请求url:%s n请求参数:%s" % (

caseRowNumber, testCaseName, priority, apiName, method, parmsType, url, data))

# 对解析出来的excel的用例数据处理

flag = data_deal(SHEET_NAME, data, rowNumber, headers, url, method, checkPoint, result, bugUrl)

# 断言

self.assertTrue(flag, msg="检查点数据与实际返回数据不一致")

else:

unittest.skip("不执行")

基于Python+unittest自动化测试框架说明文档

3.1、模块名说明

@docstring_parameter(SHEET_NAME)

class TestCase(unittest.TestCase):

'''{0}'''

模块名称:@verificating_suite(SHEET_NAME)

用SHEET_NAME = "登录"来直接指定

基于Python+unittest自动化测试框架说明文档

3.2、测试代码编写说明

代码都是封装解析好的,可以全部直接引用,文件名可以为模块名或接口名,只需要修改SHEET_NAME就可以指定excel执行用例。

3.3、断言

断言在excel中进行编写操作,具体可查看1.4.1的用例模板说明。

四、项目流程运作介绍

1、项目运行流程

1.1、获取token

登录成功后从响应从获取token。

1.2、令牌全局变量的设定存储

将token写入yaml文件并设置为全局变量,作为所有需要登录接口的令牌。

1.3、测试用例的编写及存储

在数据层编写测试用例,测试用例数据分为两个目录,combindata目录下编写组合接口的用例,singledata目录下编写单接口用例。

1.4、测试用例模板的解析及测试代码的编写

用例层编写测试用例执行代码,测试用例代码也分为两个目录,和数据层一一对应,combincase目录下编写组合接口用例的代码,singledata目录下编写单接口用例的代码。

1.5、用例的匹配与加载

项目的入口主控在main.py函数,all_case()可以加载测试用例代码,默认是加载所有用例,根据自己的需要,可在config.yml文件中选择自己想要加载的用例类型和接口用例目录。

1.6、用例执行结果写入报告

run_case(all_case, reportName=”report”)函数执行加载的用例并写入报告,报告名默认为report,支持自定义报告名

1.7、发送邮件报告

send_report(report_abspath=None)邮件发送对应的测试报告

2、后台配置文件的掌控

主要包括对环境、日志、用例、报告、邮件、socket 接口、数据库、通用参数等的配置控制,包括一些对于模块的控制开关也可以在这部分封装。

# 环境

host: http://localhost:3000 # 测试环境

# http://localhost:3001 # 开发环境

# http://localhost:3002 # 预发布环境



# 日志

log:

file_name: test.log # 文件名

backup: 5 # 保留的日志数量

console_level: INFO # 日志输出级别

file_level: DEBUG # 日志输出级别

pattern: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 日志输出格式



# 用例

case_control:

rule: test_*.py # 用例文件名的匹配原则,此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符

# 测试用例的代码的存放路径,不填或路径不存在默认加载全部用例

path:

#/singlecase # 单接口用例存放路径

#/combincase # 联合接口用例存放路径



# 报告

report:

verbosity: # 执行用例的详细程度,不填或者填写的值大于2都为默认值2

# 0 # (静默模式): 你只能获得总的测试用例数和总的结果。

# 1 # (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”

2 # (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果

title: xxx有限公司自动化测试报告 # 报告标题,如XXX自动化测试报告

description: 操作系统:macOS 版本11.6,Google Chrome:95.0.4638.69 (正式版本) (x86_64) # 说明;比如操作系统、浏览器等版本



# 邮件

mail:

title: xxxx有限公司测试报告 # 邮件标题

message: 这是今天的测试报告,请查收! # 消息

receiver: xxxx@zyyy.com # 接受者邮箱,多个邮箱接收用;隔开,例如:xxx@zyyyy.com;yyyy@zuuu.com

server: smtp.qq.com # 服务

sender: xxxxxxxx@qq.com # 发送者邮箱

password: nyyyyyyyyyyy # 密码

path: [ "report.html", "xxx.html" ] # 报告附件路径,可传入list(多附件)或str(单个附件)



# socket 接口

socket:

ip: 127.0.0.1

port: 8080



# 测试环境数据库

test_mysql:

host: xxx.xxx.xxx.xxx # 地址

port: 3306 # 端口号

user: root # 账号

passwd: "12344x" #密码

db: xxxx_dev #连接的库名



# 本地环境数据库

local_mysql:

host: 127.0.0.1

port: 3306

user: root

passwd: "xxxxx"

db: xxxx_project



# redis数据库

redis:

#host, port, password, db, list_name

host: # 地址

port: # 端口号

password: #密码

db: # 连接的库名

list_name: # 列表名



# 通用参数

general_parameters:

charset: # 字符集类型

- utf8

- utf_8_sig

default_file_name: export #默认文件名

基于Python+unittest自动化测试框架说明文档

3、报告文件介绍

3.1、总览区

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

3.2、详情区

模板1、2、3的针对yml文件提取数据的详情

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

模板4提取excel表中内容进行解析的数据详情:

用例Pass后的详情:

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

用例Fail后的详情:

除了前面的基本接口信息外,若某一条接口测试用例执行失败后,会在excel测试用例模板[执行结果]的字段回写结果[Fail],测试人员会在禅道提bug,并在用例模板[对应禅道bug-id]中手动填写bugID与用例做关联,直到用例被验证通过,且脚本自动将[执行结果]的字段回写为[Pass]状态,脚本才会自动清除bugID。

关于用例Fail部分的详情除了接口基本信息外,错误的追踪信息包括:

A、对应禅道bugId

B、断言失败的完全路径及断言异常的具体行数

C、返回断言失败原因

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

3.3、图表区

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

4、邮件与代码的对应区

基于Python+unittest自动化测试框架说明文档

基于Python+unittest自动化测试框架说明文档编辑

文章版权声明

 1 原创文章作者:shiba,如若转载,请注明出处: https://www.52hwl.com/38859.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年7月15日 上午9:25
下一篇 2023年7月15日 上午9:25