(纯干货,看完不懂你找我)Python+Pytest+Allure+Git+Jenkins接口自动化框架

2023-11-04

一、接口基础

接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,RPC,Webservice,Dubbo,RESTful等类型。

接口测试流程

1、需求评审,熟悉业务和需求

2、开发提供接口文档

3、编写接口测试用例

4、用例评审

5、提测后开始测试

6、提交测试报告

两种常见的 HTTP 请求方法:GET 和 POST

二、项目说明

本框架是一套基于Python+Pytest+Requests+Allure+Jenkins而设计的数据驱动接口自动化测试的框架。

技术栈

Python、Pytest、Requests、Pactverity、Excel、Json、Mysql、Allure、Logbook、Git、Jenkins

三、接口测试框架结构图
在这里插入图片描述

四、项目功能

Python+Pytest+Allure+Jenkins接口自动化框架,实现Excel或Json维护测试用例,支持数据库操作,利用封装的请求基类调取相应的测试用例接口,获取配置文件中的环境地址与环境变量,

结合Pytest进行单元测试,使用LogBook进行记录日志,并生成allure测试报告,最后进行Jenkins集成项目实现集成部署,并发送测试报告邮件。

五、代码设计与功能说明

1、工具类封装
1.1、log日志
项目中的log日志是logbook进行日志记录的,方便测试开发调试时进行排错纠正或修复优化。日志可选择是否打印在屏幕上即运行时是否在终端输出打印。日志格式输出可调整。

handle_log.py部分源码

def log_type(record, handler):
 2     log = "[{date}] [{level}] [{filename}] [{func_name}] [{lineno}] {msg}".format(
 3         date=record.time,  # 日志时间
 4         level=record.level_name,  # 日志等级
 5         filename=os.path.split(record.filename)[-1],  # 文件名
 6         func_name=record.func_name,  # 函数名
 7         lineno=record.lineno,  # 行号
 8         msg=record.message  # 日志内容
 9     )
10     return log
11 # 日志存放路径
12 LOG_DIR = BasePath + '/log'
13 print(LOG_DIR)
14 if not os.path.exists(LOG_DIR):
15     os.makedirs(LOG_DIR)
16 # 日志打印到屏幕
17 log_std = ColorizedStderrHandler(bubble=True)
18 log_std.formatter = log_type
19 # 日志打印到文件
20 log_file = TimedRotatingFileHandler(
21     os.path.join(LOG_DIR, '%s.log' % 'log'), date_format='%Y-%m-%d', bubble=True, encoding='utf-8')
22 log_file.formatter = log_type
23 
24 # 脚本日志
25 run_log = Logger("global_log")
26 def init_logger():
27     logbook.set_datetime_format("local")
28     run_log.handlers = []
29     run_log.handlers.append(log_file)
30     run_log.handlers.append(log_std)
31     return ""

打印在终端的日志,如下图所示。
在这里插入图片描述
同时运行项目后,会在项目文件log中自动生成一个以当天日期命名的log文件。点击log日志文件可查看日志详情即项目运行时所记录的日志或报错日志。如下图所示。
在这里插入图片描述
1.2、配置文件
项目中涉及到一些配置文件如username、password或环境变量时,我们可通过配置文件来获取配置值。通过配置文件中key与value的定义来确定获取配置文件的值。

handle_init.py部分源码

 1 class HandleInit:
 2     # 读取配置文件
 3     def load_ini(self):
 4         file_path = BasePath + "/config/config.ini"
 5         cf = configparser.ConfigParser()
 6         cf.read(file_path, encoding='UTF-8')
 7         return cf
 8 
 9     # 获取ini里面对应key的value
10     def get_value(self, key, node=None):
11         if node == None:
12             node = 'Test'
13         cf = self.load_ini()
14         try:
15             data = cf.get(node, key)
16             logger.info('获取配置文件的值,node:{},key:{}, data:{}'.format(node, key, data))
17         except Exception:
18             logger.exception('没有获取到对应的值,node:{},key:{}'.format(node, key))
19             data = None
20         return data

获取配置文件中的值日志如下图所示。
在这里插入图片描述
1.3、Api接口请求
获取相关测试用例及接口用例配置,记录请求相关参数的日志,定义Allure测试报告的步骤。

handle_apirequest.py部分代码

 1 class ApiRequest:
 2     def api_request(self, base_url, test_case_data, case_data):
 3         get_name = None
 4         get_url = None
 5         get_method = None
 6         get_headers = None
 7         get_cookies = None
 8         get_case_name = None
 9         get_case_params = None
10         response_data = None
11         try:
12             get_name = test_case_data['config']['name']
13             get_url = base_url + test_case_data['config']['url']
14             get_method = test_case_data['config']['method']
15             get_headers = test_case_data['config']['headers']
16             get_cookies = test_case_data['config']['cookies']
17         except Exception as e:
18             logger.exception('获取用例基本信息失败,{}'.format(e))
19         try:
20             get_case_name = case_data['name']
21             get_case_params = case_data['params']
22         except Exception as e:
23             logger.exception('获取测试用例信息失败,{}'.format(e))
24         with allure.step("请求接口:%s,请求地址:%s,请求方法:%s,请求头:%s,请求Cookies:%s" % (
25                 get_name, get_url, get_method, get_headers, get_cookies)):
26             allure.attach("接口用例描述:", "{0}".format(get_case_name))
27             allure.attach("接口用例请求参数:", "{0}".format(get_case_params))
28         logger.info(
29             '请求接口名:%r,请求地址:%r,请求方法:%r,请求头:%r,请求Cookies:%r' % (get_name, get_url, get_method, get_headers, get_cookies))
30         logger.info('请求接口名:%r,请求接口用例名:%r,接口用例请求参数:%r' % (get_name, get_case_name, get_case_params))
31         try:
32             response_data = baseRequest.run_main(get_method, get_url, get_case_params, get_headers)
33         except Exception as e:
34             logger.exception('用例请求返回失败,{}'.format(e))
35         logger.info('请求接口名:%r,请求接口用例名:%r,返回参数:%r' % (get_name, get_case_name, response_data.json()))
36         return response_data

1.4、Excel数据处理
1.4.1、Excel测试用例

在这里插入图片描述
测试用例中维护在Excel文件中,类中定义如何获取Excel中的相关数据(如获取某个单元格的内容,获取单元格的行数,以及将数据写入Excel中等操作)。

handle_exceldata.py部分源码

1 class OperationExcel:
 2     def __init__(self, file_name=None, sheet_id=None):
 3         if file_name:
 4             self.file_name = file_name
 5             self.sheet_id = sheet_id
 6         else:
 7             self.file_name = ''
 8             self.sheet_id = 0
 9         self.data = self.get_data()
10 
11     # 获取sheets的内容
12     def get_data(self):
13         data = xlrd.open_workbook(self.file_name)
14         tables = data.sheets()[self.sheet_id]
15         return tables
16 
17     # 获取单元格的行数
18     def get_lines(self):
19         tables = self.data
20         return tables.nrows
21 
22     # 获取某一个单元格的内容
23     def get_cell_value(self, row, col):
24         return self.data.cell_value(row, col)

1.5、Json数据处理
1.5.1、Json测试用例

 1 {
 2     "config":{
 3         "name":"post接口名",
 4         "url":"/langdetect",
 5         "method":"POST",
 6         "headers":{
 7             "Content-Type":"application/json"
 8         },
 9         "cookies":{
10 
11         }
12     },
13     "testcase":[
14         {
15             "name":"测试用例1",
16             "params":{
17                 "query":"测试"
18             },
19             "validate":[
20                 {
21                     "check":"status_code",
22                     "comparator":"eq",
23                     "expect":"200"
24                 }
25             ]
26         },
27         {
28             "name":"测试用例2",
29             "params":{
30                 "query":"python"
31             },
32             "validate":[
33                 {
34                     "check":"msg",
35                     "comparator":"eq",
36                     "expect":"success"
37                 }
38             ]
39         }
40     ]
41 }

1.5.2、Json用例处理
获取Json文件中里具体字段的值。

handle.json.py部分源码

 1 class HandleJson:
 2     # 读取json文件
 3     def load_json(self, file_name):
 4         if file_name == None:
 5             file_path = ""
 6         else:
 7             file_path = file_name
 8         try:
 9             with open(file_path, encoding='UTF-8') as f:
10                 data = json.load(f)
11             return data
12         except Exception:
13             print("未找到json文件")
14             return {}
15 
16     # 读取json文件里具体的字段值
17     def getJson_value(self, key, file_name):
18         if file_name == None:
19             return ""
20         jsonData = self.load_json(file_name)
21         if key == None:
22             getJsonValue = ""
23         else:
24             getJsonValue = jsonData.get(key)
25         return getJsonValue

2、基类封装
2.1、请求基类封装

接口支持Get、Post请求,调用requests请求来实现接口的调用与返回。接口参数包括,接口地址、接口请求参数、cookie参数、header参数。

 1 class BaseRequest:
 2 
 3     def send_get(self, url, data, header=None, cookie=None):
 4         """
 5         Requests发送Get请求
 6         :param url:请求地址
 7         :param data:Get请求参数
 8         :param cookie:cookie参数
 9         :param header:header参数
10         """
11         response = requests.get(url=url, params=data, cookies=cookie, headers=header)
12         return response
13 
14     def send_post(self, url, data, header=None, cookie=None):
15         """
16         Requests发送Post请求
17         :param url:请求地址
18         :param data:Post请求参数
19         :param data:Post请求参数
20         :param cookie:cookie参数
21         :param header:header参数
22         """
23         response = requests.post(url=url, json=data, cookies=cookie, headers=header)
24         return response
25 
26         # 主函数调用
27 
28     def run_main(self, method, url, data, header, cookie=None):
29         try:
30             result = ''
31             if method.upper() == 'GET':
32                 result = self.send_get(url, data, header, cookie)
33             elif method.upper() == 'POST':
34                 result = self.send_post(url, data, header, cookie)
35             return result
36         except Exception as e:
37             logger.exception('请求主函数调用失败:{}'.format(e))

3、接口测试用例编写
3.1、接口测试用例

引用Pytest来进行接口的单元测试,通过JSON中多个测试用例来做为参数化数据驱动。结合Allure制定相应接口的测试报告。在接口返回断言之前,我们先进行该接口的契约测试,

我们采用的是Pactverity的全量契约校验测试。当契约测试通过时,我们再进行返回参数的相关校验测试。

test_getRequestJson.py部分源码

1 @allure.feature('测试GET请求模块')
 2 class TestRequestOne():
 3     @allure.title('测试标题')
 4     @allure.testcase('测试地址:https://www.imooc.com')
 5     @pytest.mark.parametrize('case_data', testCaseData['testcase'])
 6     def test_requestOne(self, case_data):
 7         try:
 8             api_response = apiRequest.api_request(baseurl, testCaseData, case_data)
 9             api_response_data = api_response.json()
10             # pactverity——全量契约校验
11             config_contract_format = Like({
12                 "msg": "成功",
13                 "result": 0,
14                 "data": EachLike({
15                     "word": Like("testng")
16                 })
17             })
18             mPactVerify = PactVerify(config_contract_format)
19             try:
20                 mPactVerify.verify(api_response_data)
21                 logger.info(
22                     'verify_result:{},verify_info:{}'.format(mPactVerify.verify_result, mPactVerify.verify_info))
23                 assert mPactVerify.verify_result == True
24             except Exception:
25                 err_msg = '契约校验错误'
26                 logger.exception('测试用例契约校验失败,verify_result:{},verify_info:{}'.format(mPactVerify.verify_result,
27                                                                                      mPactVerify.verify_info))
28             try:
29                 for case_validate in case_data['validate']:
30                     logger.info('断言期望相关参数:check:{},comparator:{},expect:{}'.format(case_validate['check'],
31                                                                                    case_validate['comparator'],
32                                                                                    case_validate['expect']))
33                     comparatorsTest.comparators_Assert(api_response, case_validate['check'],
34                                                        case_validate['comparator'], case_validate['expect'])
35                     logger.info('测试用例断言成功')
36             except Exception as e:
37                 logger.exception('测试用例断言失败')
38         except Exception as e:
39             logger.exception('测试用例请求失败,原因:{}'.format(e))

3.2、主运行
运用Pytest和Allure的特性,命令行运行测试用例文件夹,并生成对应的allure测试报告。

if __name__ == "__main__":
2     pytest.main(['-s', '-v', 'test_case/testRequest/', '-q', '--alluredir', 'reports'])

4、Allure2测试报告
当我们运行主函数时,并生成对应的测试用例报告时,我们可以看到在该文件夹中会生成对应的json文件的测试报告。将json文件的测试报告转换成html形式的。命令如下

reports是json格式测试报告存放的目录位置,allure_reports是html测试报告文件生成的目录位置。allure命令如下。

1 allure generate reports -o allure_result/

项目根目录下的allure_reports文件,存放的是allure生成的测试报告。可看出文件下有一个HTML文件,可通过Python的编辑器Pycharm来打开该HTML文件(测试报告),

或可通过allure命令来打开该HTML,展示HTML测试报告。如下所示。

点赞关注~~加入我们,了解更多。642830685。群内免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

测试报告文件,HTML测试报告如下。
在这里插入图片描述
allure命令打开HTML测试报告。命令如下所示。

1 allure open allure_result/

如下图所示。
在这里插入图片描述
打开生成的HTML测试报告如下图所示。
在这里插入图片描述
5、Jenkins集成
Allure+Jenkins的分享,我之前在Pytest+Allure+Jenkins的博客中已经分享过了。这块可以出门左转看看。前期的准备就不在这里重复说明了。我们就直接来上手创建Item进行相关配置。

General中GitHub项目地址的配置,将自己项目的Git复制至项目URL处。如下图所示。
在这里插入图片描述
源码管理设置。勾选Git,填写相应的项目Git地址,Git项目权限所有者,以及对应的拉取代码的分支。如下图所示。
在这里插入图片描述
配置构建命令。选择“执行windows批处理命令”,用python运行主函数运行脚本,命令如下图所示。
在这里插入图片描述
当我们在Jenkins里面成功安装Allure插件后,直接可以在构建后操作中配置Allure的相关配置。在Pytest+Allure+Jenkins中已经说明过的。

Results应与项目运行时设置的Allure生成的Json格式报告的路径一致,Report path为Allure html报告结果生成文件存放的路径。

在这里插入图片描述
排除万难之后,我们就可以用Jenkins来运行项目了。如下图所示。
在这里插入图片描述
测试报告详情页,如下图所示。
在这里插入图片描述

六、后期优化

1、接口测试用例之间的数据依赖

2、测试报告邮件的发送

。。。。。。

七、感想

该框架涉及python的知识点比较多,适合新手入门接口自动化实战练习,仅供参考学习。框架中有不少可优化点与不足点,希望大家多多提建议或想法。

点赞关注~~加入我们,了解更多。642830685。群内免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(纯干货,看完不懂你找我)Python+Pytest+Allure+Git+Jenkins接口自动化框架 的相关文章

  • 从数据框中按索引删除行

    我有一个数组wrong indexes train其中包含我想从数据框中删除的索引列表 0 63 151 469 1008 要删除这些索引 我正在尝试这样做 df train drop wrong indexes train 但是 代码失败
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • Python - 将宽字符字符串从二进制文件转换为 Python unicode 字符串

    这是漫长的一天 我有点困惑 我正在读取一个包含大量宽字符字符串的二进制文件 我想将它们转储为 Python unicode 字符串 为了解压非字符串数据 我使用 struct 模块 但我不知道如何对字符串执行相同的操作 例如 阅读 系列 一
  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • Python逻辑运算符优先级[重复]

    这个问题在这里已经有答案了 哪个运算符优先4 gt 5 or 3 lt 4 and 9 gt 8 这会被评估为真还是假 我知道该声明3 gt 4 or 2 lt 3 and 9 gt 10 显然应该评估为 false 但我不太确定 pyth
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 在Python中按属性获取对象列表中的索引

    我有具有属性 id 的对象列表 我想找到具有特定 id 的对象的索引 我写了这样的东西 index 1 for i in range len my list if my list i id specific id index i break
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • anaconda使用笔记(包括pip命令)

    anaconda使用笔记 包括pip命令 1 conda命令 conda命令使用方式 方式一 直接打开Anaconda Prompt即可 方式二 打开anaconda 然后在environment中选择你用的环境 点击运行图标 选择Open
  • ajax请求图片_带你完成第一个爬虫,简单爬取百度图片

    大家好 我是润森 什么是爬虫 网络爬虫 又被称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 另外一些不常使用的名字还有蚂蚁 自动索引 模拟程序或者蠕虫 来源 百
  • 华为数据之道

    由华为董事 质量与流程IT总裁 CIO陶景文 作序推荐 华为质量与流程IT 华为云 华为大学 联合出品 总结华为公司数据治理 数字化转型方面的实践经验 从技术 流程 管理等多个维度系统讲解华为数据治理和数字化转型的著作 华为是一家超大型企业
  • CTFHub

    0x00 前言 CTFHub 专注网络安全 信息安全 白帽子技术的在线学习 实训平台 提供优质的赛事及学习服务 拥有完善的题目环境及配套 writeup 降低 CTF 学习入门门槛 快速帮助选手成长 跟随主流比赛潮流 0x01 题目描述 过
  • QDockWidget详解(二)

    上次在 QDockWidget详解文章中介绍了一些有关QDockWidget的基础用法 今天继续来讲QDockWidget的用法 自定义标题栏 如果不想使用QDockWidget自带的标题栏 那么可以通过 void QDockWidget
  • 阿里云原生大数据计算服务maxcompute学习体验

    这两天有兴趣学习了下阿里的maxcompute大数据 随便谈谈自己的感受 一 感受 阿里云相关的产品线太多了 热门产品一页已经放不下了 正因为东西太多给人一种杂乱的感觉 也可能这是给技术人员用的 所以不用太讲客户体验 反正给我的体验就不太好
  • 五、数据仓库详细介绍(建模)实践篇

    1 数仓建模在数仓建设过程中的位置 这张截图源自之前从 0 到 1 建设数据仓库的经验总结 采用的是瀑布模式的展现方式 但实际操作中经常会使用螺旋迭代模式 因为很难有人能够一步到位的考虑清楚所有细节 通过业务调研我们熟悉了相关业务过程 需求
  • 2023-Python实现巨潮资讯网数据采集

    目录 1 目标网址 2 接口分析调试 3 代码实现 学习记录 巨潮资讯网数据采集 1 目标网址 网页 深证信数据服务平台 巨潮资讯 gt 网行情中心 网页 http webapi cninfo com cn marketDataDate 数
  • 寒假小复习5

    插入排序 public class Insert public static void main String args int nums 12 4 6 2 66 1 4 for int i 1 i lt nums length i int
  • 【华为OD机试 python】新员工座位安排系统【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 工位由序列F1 F2 Fn组成 Fi值为0 1或2 其中0代表空置 1代表有人 2代表障碍物 1 某一空位的友好度为左右连续老员工数之和 2 为
  • vue3 element-plus 表格中必填项展示的星号的前后位置设置

    情况一 必填项的星号在前面 情况图片展示 实现方法 直接使用表单规则校验来实现 注意 规则校验一定要绑定prop 代码展示 html
  • Scrapy入门

    文章目录 Scrapy入门 1 目标 2 准备工作 3 创建项目 4 创建 Spider 5 创建 Item 6 解析 Response 7 使用Item 8 后续Request 9 运行 10 保存到文件 11 使用Item Pipeli
  • filebeat+kafka简单使用

    filebeat6 3 1 kafka1 1 0简单使用 前提 kafka1 1 0版本集群搭建和常用命令 下载 下载页面 https www elastic co cn downloads past releases filebeat 6
  • Java语言开发在线新闻推荐网 新闻推荐系统 基于用户、物品的协同过滤推荐算法 环球日报新闻爬虫 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、机器学习、人工智能开发

    Java语言开发在线新闻推荐网 新闻推荐系统 基于用户 物品的协同过滤推荐算法 环球日报新闻爬虫 SSM Spring SpringMVC Mybatis 开发框架 大数据 机器学习 人工智能开发NewsRecommendOnline 一
  • 图像/视频超分之降质过程

    点击上方 计算机视觉工坊 选择 星标 干货第一时间送达 图像 视频超分领域近期并无突破性的方法出现 故近期计划将图像 视频超分相关方法进行一次综述性汇总 计划从不同点出发对图像 视频超分进行一次 反思 之旅 本文是该旅程的第一站 图像降质过
  • 【入侵检测】5.27quiz

    入侵检测 5 27 课上quiz1 3 今天两门课上一共发了4个quiz 属实难顶 quiz1 quiz1是对XTP文件的信息内容进行读取查找 找到相应的flag信息 题目 请输入Linux XTP文件中包含的Flag信息 直接将文件 li
  • 在 Windows 下搭建 Appium + Android 自动化测试环境

    前言 本来并不打算写这么一篇文章 但是实践下来发现网上的各种教程里大致有两个问题 一是文章有些跟不上时代 目前android开发和测试的技术更新都比较快 内容有些过期 二是细节部分不是太完整 拼拼凑凑也能完成 但对新手来说就比较痛苦 那么
  • 【带限制的完全背包】Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move

    题意 给定 n n n 和 k k k 初始步长为 k k k 每次可以走
  • 逆向python生成的可执行文件

    先安装pyinstaller pip install pyinstaller i https pypi douban com simpl 写一个简单的脚本 print hello world pyinstaller基本用法 常用的可选参数如
  • (纯干货,看完不懂你找我)Python+Pytest+Allure+Git+Jenkins接口自动化框架

    Python Pytest Allure Git Jenkins接口自动化框架 一 接口基础 二 项目说明 四 项目功能 五 代码设计与功能说明 六 后期优化 七 感想 一 接口基础 接口测试是对系统和组件之间的接口进行测试 主要是效验数据