python3+unittest+ddt+excel+jenkins接口自动化测试讲解(一)

Hello,好久没更新了,今天跟大家一起来学习下基于unittest的接口自动化测试,先给大家看下最终的unittest框架目录结构:

这里大家需要下载的第三方库分别是:

pip3 install requests/pip3 install ddt/pip3 install openpyxl/pip3 install mysql-connector/pip3 install unittest

可能会有些许的遗漏,具体大家在写的时候,如果发现第三方没有,自己再安装下。

(一:)接下来,我们先来学习下这个第三方库:requests,这个库可以通过接口的请求方式来做接口的触发,主要是协助完成http请求,这里主要介绍我们常见的两种请求方式:get/post,直接上代码(下面这段代码小伙伴们可以拿来直接练手):

import requests,json
url='http://web.juhe.cn:8080/constellation/getAll'
body={
    "key":"921d7e156beff25d4d61c407ea345fdb",
    "consName":"双鱼座",
    "type":"today"
}
response_get=requests.get(url,params=body)
print('响应状态码:',response_get.status_code)
print('响应文本:',response_get.text)
print('响应头:',response_get.headers)
print('----------------------------------------')
response_post=requests.post(url,data=body)
print('响应状态码:',response_post.status_code)
print('响应文本:',response_post.text)
print('响应头:',response_post.headers)

输出的结果:
响应头: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=B85EFCBD82811C355C48DCCD84F87013; Path=/constellation; HttpOnly'}
响应状态码: 200
响应正文: {"date":20200428,"name":"双鱼座","QFriend":"双子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己会很想组织一个聚会,反正会想各种懒散。不过今天要注意下人际交往,今天自己的想法不太容易被他人重视,不过自己也不是那么计较。今天在人际或是活动中也容易遇到猪队友影响心情。","all":"80","resultcode":"200","error_code":0}
----------------------------------------
响应头: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=48C75CAE9ECFF8B55505A72ABB8EDCDD; Path=/constellation; HttpOnly'}
响应状态码: 200
响应正文: {"date":20200428,"name":"双鱼座","QFriend":"双子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己会很想组织一个聚会,反正会想各种懒散。不过今天要注意下人际交往,今天自己的想法不太容易被他人重视,不过自己也不是那么计较。今天在人际或是活动中也容易遇到猪队友影响心情。","all":"80","resultcode":"200","error_code":0}

这里需要跟大家说明的是:我这里没有上送请求头,有些接口是需要上送请求头headers的,所以如果有请求头,需要注意的是请求头里是否有如下的头信息:

header={
    "Content-Type": "application/json"
}

如果请求头里已经表明json,那么我们在发接口的时候,请求体body里面需要转换下类型,主要是把dict转成json,可以使用json.dumps(),另外把json转成dict,可以使用json.loads()

(二:)接下来,我们来学习下unittest框架,这个框架我个人觉得,如果公司的接口与接口之间依赖性不是很高的,那用这个框架还是可以的,如果依赖性很高,那用起来会有些许的不方便,反而用其他一些工具效率来的更高,比如:jmeter、postman,这里的依赖性很高,指得是上一个接口应答报文的某个值是下一个请求报文的入参,所以我们需要对接口做相应的关联。

先来学习下unittest框架的基本结构:

import unittest
class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls)->None:
        print('1')
    def setUp(self)->None:
        print('2')
    def tearDown(self)->None:
        print('3')
    @classmethod
    def tearDownClass(cls)->None:
        print('4')
    def test_01(self):
        print('第一个测试案例')
    def test_02(self):
        print('第二个测试案例')

if __name__=='__main__':
    unittest.main()

输出的结果:
    1
    2
    第一个测试案例
    3
    2
    第二个测试案例
    3
    4
    

这里需要说明下:首先测试案例必须以test开头来命名,另外setUp()和tearDown是对于每条测试案例执行前每次都要执行一边,简单说就是你有多少条测试案例,就要在每条案例执行前先执行下setUp,案例结束之后每次都要执行一次tearDown,所以从结果可以看出案例执行之前会先输出2,结束会输出3

对于被装饰器修饰的类方法,这个是针对所有的案例开始前setUpClass要执行一次,这里不像setUp,只要执行测试案例它都要执行,同时tearDownClass是所有案例执行结束后执行一次,结合上面的输出结果就很明显了。

(三:)学完unittest,我们来看下测试报告的生成

unittest会自动生成测试报告,但是需要借助第三方的一个报告模板HTMLTestRunner,需要把这个模板存放在python的安装目录的Lib目录下,这个模板可以去官网下载。

下面介绍两种加载测试用例的方法,一种是指向封装测试用例的类,一种是指向封装测试的模块

#1:这是指向模块的加载方法
import unittest
import HTMLTestRunner

suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#这里的test_case是之前写的unittest框架中的测试用例的文件名,需要先导入这个模块

with open('test.html','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='测试报告',
                                        description='接口测试用例报告'
                                        )
    runner.run(suit)


#2:这是指向类的加载方法

suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#这里的test_case是之前写的unittest框架中的测试用例的文件名,需要先导入这个模块
with open('test.html','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='测试报告',
                                        description='接口测试用例报告'
                                        )
    runner.run(suit)

#3:另外这里介绍加载单个测试用例的方法
suit=unittest.TestSuite()
suit.addTest(Test_Mathmethod('test_01'))#这里是某个类中的某个方法,所以之前需要导入这个类
with open('','wb',encoding='utf-8') as f:
    runner=HTMLTestRunner.HTMLTestRunner(
                                        stream=f,
                                        verbosity=2,
                                        title='测试报告',
                                        description='接口测试用例报告'
                                        )
    runner.run(suit)

下期介绍如何从excel中读取数据,以及如何链接数据库,管理我们的配置文件之类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值