python中unittest+ddt的应用

2023-11-18

一、单个EXCEL执行

import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr  # 反射的值
from ddt import ddt, data, unpack
from class_demo_login_topup.http_excel import HttpExcel  # 读取excel的值


test_data = HttpExcel('test_api.xlsx', 'python').real_excel()
# test_data = [] 遍历 测试用例
# t = HttpExcel('test_api.xlsx', 'python').real_excel()
# for i in range(len(t)):
#     if i % 2 == 0:
#         test_data.append(t[i])

@ddt
class Login_Http(unittest.TestCase):


    @data(*test_data)
    def test_api(self, item):  # 正常登录
        res = http_request().request(item['url'], eval(item['data']), item['method'], getattr(Get_Attr, 'cookies'))
        if res.cookies:
            setattr(Get_Attr, 'cookies', res.cookies)
        try:
            self.assertEqual(str(item['expected']), res.json()['code'])
        except AssertionError as e:
            print("test_api's, error is {0}", format(e))
            raise e
        print(res.json())


执行文件:

import unittest
import HTMLTestRunner

suite = unittest.TestSuite()
loader = unittest.TestLoader()

from class_demo_login_topup import http_tools_1
suite.addTest(loader.loadTestsFromModule(http_tools_1))  # 对整个文件执行

with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
    runner = unittest.TextTestRunner(stream=file, verbosity=2)
    runner.run(suite)

生产http_TestCase.txt的文件,后者生产:html格式

with open('Test_Case.html', 'wb') as file:
    runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=0,
                                           title=None, description=None)
    runner.run(suite)

其中Excel中的数据是这样的:

# 实现第一种遍历 全部参数化
# 列表里面嵌套了字典
test_data = [{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
              'data': {'mobilephone': '13972136808', 'pwd': '123456'}, 'expected': '10001', 'method': 'get'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
              'data': {'mobilephone': '13972136808', 'pwd': '12345678'}, 'expected': '20111', 'method': 'get'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
              'data': {'mobilephone': '13972136808', 'amount': '1000'}, 'expected': '10001', 'method': 'post'},
             {'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
              'data': {'mobilephone': '13972136808', 'amount': '-100'}, 'expected': '20117', 'method': 'post'}]

#  利用excel去遍历
from openpyxl import load_workbook

class HttpExcel:
    def __init__(self, excel_name, sheet_name):
        self.excel_name = excel_name
        self.sheet_name = sheet_name

    def real_excel(self):  # real_excel(self, mode='all'):
        mode = FileConfig().config('do_config', 'MODE', 'mode')  # 遍历 1 3 登录和充值两条用例
        wb = load_workbook(self.excel_name)
        sheet = wb[self.sheet_name]
        test_data = []
        for i in range(1, sheet.max_row + 1):  # 遍历 1 2 3 4 sheet.max_row EXCEL中的最大行
            sub_test = {}
            sub_test['mode'] = sheet.cell(i, 1).value
            sub_test['url'] = sheet.cell(i, 2).value
            sub_test['data'] = sheet.cell(i, 3).value
            sub_test['method'] = sheet.cell(i, 4).value
            sub_test['expected'] = sheet.cell(i, 5).value
            test_data.append(sub_test)
        if mode == 'all':
            final_data = test_data
        else:
            final_data = []
            for item in test_data:
                if item['mode'] in eval(mode):
                    final_data.append(item)
        return final_data
    def write_back(self, i, value):  # 把测试结果写入到EXCEL文件中 I 行数 V 结果值保存
       	wb = openpyxl.load_workbook(self.file_name)
       	sheet = wb[self.sheet_name]
       	sheet.cell(i, 7).value = value
       	wb.save(self.file_name)


if __name__ == '__main__':
    test_data = HttpExcel('test_api.xlsx', 'python').real_excel()
    print(test_data)  # 遍历的就是我们上面 test_data 的数据 


二、多个EXCEL执行用例
如果是:注册、登录、充值分别都在不同的表单里面:去遍历这些个用例,结果写回返回值。
在这里插入图片描述

register:
在这里插入图片描述
login:
在这里插入图片描述
recharge:
在这里插入图片描述

执行ddt:

import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr
from test_tools.common.pubilc.real_excel import Excel
from ddt import ddt, data, unpack
from test_tools.common.conf.path_class import *  # 读取路径 


test_data = Excel.read_excel(test_xlsx)
# test_xlsx 执行xlsx文件的路径

@ddt
class Http_Api(unittest.TestCase):
    def setUp(self) -> None:
        pass

    @data(*test_data)
    def test_api(self, item):  # 列表嵌套字典的数据格式进来
        print("正在测试的是:{0}".format(item['meg']))
        res = http_request().request(item['url'], eval(item['data']), item['method'], getattr(Get_Attr, 'cookies'))
        if res.cookies:
            setattr(Get_Attr, 'cookies', res.cookies)
        try:
            self.assertEqual(str(item['expected']), res.json()['code'])
            TestResult = 'PASS'  # 成功的
        except AssertionError as e:
            print('执行用例出错:{}'.format(e))
            TestResult = 'Failed'  # 失败的
            raise e
        finally:
            Excel.write_back(test_xlsx, item['sheet_name'], item['mode']+1, str(res.json()), str(TestResult))
            #item['sheet_name'] 执行的文件
            print("请求的结果是:{0}".format(res.json()))

    def tearDown(self) -> None:
        pass
        

二、config文件里面配置

[MODE]
mode={"login":"all",
      "register":[1,2],
      "recharge":[1,2]}

执行的就是:登录的全部用例还有和注册的第一条和第二条用例

三、读取config的类

import configparser
from test_tools.common.conf.path_class import *


class ReadConfig():
    @staticmethod
    def get_cinfig(file_name, section, option):
        cf = configparser.ConfigParser()
        cf.read(file_name, encoding='utf-8')
        return cf.get(section, option)
        # return cf[section][option]


if __name__ == '__main__':
    cf = ReadConfig.get_cinfig(case_config_data, 'MODE', 'mode')
    print(cf)
    

四、读取和写入excel的类

import openpyxl
from test_tools.common.conf.path_class import *
from test_tools.common.pubilc.real_config import ReadConfig


class Excel:
    @staticmethod
    def read_excel(file_name):
        wb = openpyxl.load_workbook(file_name)
        mode = eval(ReadConfig.get_cinfig(case_config_data, 'MODE', 'mode'))  # 获取config文件里面的数据 eval 还原的字典类型
        test_data = []
        for key in mode:  # 遍历存在配置文件的字典 login 登录,register 注册 ,recharge 充值
            sheet = wb[key]  # 表单名
            if mode[key] == 'all':
                for i in range(2, sheet.max_row+1):
                    sub_test = {}
                    sub_test['mode'] = sheet.cell(i, 1).value
                    sub_test['url'] = sheet.cell(i, 2).value
                    sub_test['data'] = sheet.cell(i, 3).value
                    sub_test['method'] = sheet.cell(i, 4).value
                    sub_test['expected'] = sheet.cell(i, 5).value
                    sub_test['meg'] = sheet.cell(i, 6).value
                    sub_test['sheet_name'] = key  # 方便执行不同的文件
                    test_data.append(sub_test)
            else:
                for case_id in mode[key]:
                    sub_test = {}
                    sub_test['mode'] = sheet.cell(case_id+1, 1).value
                    sub_test['url'] = sheet.cell(case_id+1, 2).value
                    sub_test['data'] = sheet.cell(case_id+1, 3).value
                    sub_test['method'] = sheet.cell(case_id+1, 4).value
                    sub_test['expected'] = sheet.cell(case_id+1, 5).value
                    sub_test['meg'] = sheet.cell(case_id+1, 6).value
                    sub_test['sheet_name'] = key  # 方便执行不同的文件
                    test_data.append(sub_test)
        return test_data

    @staticmethod
    def write_back(file_name, sheet_name, i, result, TestResult):  # 把测试结果写入到EXCEL文件中 I 行数, result 返回结果值保存, TestResult PASS或Failed
        wb = openpyxl.load_workbook(file_name)
        sheet = wb[sheet_name]
        sheet.cell(i, 7).value = result
        sheet.cell(i, 8).value = TestResult
        wb.save(file_name)

if __name__ == '__main__':
    data = Excel.read_excel(test_xlsx)
    print(data)

五、执行unittest

from test_tools.common.pubilc.requests_class import Http_Api
from test_tools.common.conf.path_class import *
import unittest
import HTMLTestRunner


suite = unittest.TestSuite()
loder = unittest.TestLoader()

suite.addTest(loder.loadTestsFromTestCase(Http_Api))

with open(test_run, 'wb') as file:
    runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2)
    runner.run(suite)

执行结果:
在这里插入图片描述
六、实现EXCEL的可配置化、数据的参数化。
1,利用config的类,定义一个可控的配置 :
首先遍历注册接口,其他接口不处理

[MODE]
test={'login':[],'register':'all','recharge':[]}

2,EXCEL的修改,注册的接口中的手机号${tel_1}替换为sheet中tel的手机号,tel替换为sheet中的手机号+1,再存到sheet中去作为下一次的调用
在这里插入图片描述
在这里插入图片描述

代码如下:EXCEL类,利用字符串函数查找数据

import openpyxl
from class_api_tow.config_class import read_config
from class_api_tow.Tel import DataTel
import pandas as pd


class DoExcel():

    @classmethod
    def doexcel(cls, fine_name):
        # tel = getattr(DataTel, 'data')
        tel = pd.read_excel('test_data.xlsx', sheet_name='sheet').loc[0, ['tel']].values[0]
        wb = openpyxl.load_workbook(fine_name)
        test_data = []
        res = eval(read_config('excel_config', 'MODE', 'test'))
        for key in res:
            sheet = wb[key]
            if res[key] == 'all':  # 遍历全部
                for i in range(2, sheet.max_row + 1):
                    row_data={}
                    row_data['mode'] = sheet.cell(i, 1).value
                    row_data['url'] = sheet.cell(i, 2).value
                    # row_data['data'] = sheet.cell(i, 3).value
                    if sheet.cell(i, 3).value.find('${tel_1}') != -1:
                        row_data['data'] = sheet.cell(i, 3).value.replace('${tel_1}', str(tel))
                    elif sheet.cell(i, 3).value.find('${tel}') != -1:
                        row_data['data'] = sheet.cell(i, 3).value.replace('${tel}', str(tel+1))
                    else:
                        row_data['data'] = sheet.cell(i, 3).value
                    row_data['method'] = sheet.cell(i, 4).value
                    row_data['expected'] = sheet.cell(i, 5).value
                    row_data['sheet_name'] = key
                    test_data.append(row_data)
                    # DoExcel.write_tel(fine_name, tel+1)
                    cls.write_tel(fine_name, tel+1)  # 调用类方法

            else:
                for mode in res[key]:  # 按照case_id的取值来遍历用例
                    row_data = {}
                    row_data['mode'] = sheet.cell(mode+1, 1).value
                    row_data['url'] = sheet.cell(mode+1, 2).value
                    if sheet.cell(mode, 3).value.find('${tel}') != -1:
                        row_data['data'] = sheet.cell(mode, 3).value.replace('${tel}', str(tel))
                    elif sheet.cell(mode, 3).value.find('${tel_1}') != -1:
                        row_data['data'] = sheet.cell(mode, 3).value.replace('${tel}', str(tel+1))
                    else:
                        row_data['data'] = sheet.cell(mode, 3).value
                    row_data['method'] = sheet.cell(mode+1, 4).value
                    row_data['expected'] = sheet.cell(mode+1, 5).value
                    row_data['sheet_name'] = key
                    test_data.append(row_data)
                    DoExcel.write_tel(fine_name, tel+1)
        return test_data


    @staticmethod
    def write_back(fine_name, sheet_name, i, value, TestResult):
        wb = openpyxl.load_workbook(fine_name)
        sheet = wb[sheet_name]
        sheet.cell(i, 7).value = value
        sheet.cell(i, 8).value = TestResult
        wb.save(fine_name)

    @classmethod # 写回手机号的新数据
    def write_tel(cls, fine_name, value):
        wb = openpyxl.load_workbook(fine_name)
        sheet = wb['sheet']
        sheet.cell(2, 1).value = value
        wb.save(fine_name)

    @staticmethod
    def readopxl(fine_name):
        wb = openpyxl.load_workbook(fine_name)
        sheet = wb['register']
        res = sheet.cell(2, 3).value
        return res



if __name__ == '__main__':
    test_data = DoExcel.doexcel(r'E:\wk\project\class_api_tow\test_data.xlsx')
    print(test_data)

3,ddt代码和运行代码

from class_api.class_chushi import Http_Ruests
import unittest
from class_api.class_demo_fanshe import GetData  # 方案二
from ddt import ddt, data, unpack
from class_api_tow.doexcel import DoExcel
from learning_wk.login_class.login_wk import My_log
my_logger = My_log()

test_data = DoExcel.doexcel('test_data.xlsx')

@ddt
class Http_Requests(unittest.TestCase):

    @data(*test_data)
    def test_login_True(self, item):
        res = Http_Ruests().login_requests(item['url'], eval(item['data']), item['method'], getattr(GetData, 'cookies'))
        if res.cookies:
            setattr(GetData, 'cookies', res.cookies)  # 方案二
        try:
            self.assertEqual(str(item['expected']), res.json()['code'])
            test_result = 'PASS'
        except AssertionError as e:
            test_result = 'failed'
            my_logger.info("执行用例出错 {}".format(e))
            # print("执行用例出错 {}".format(e))
            raise e
        finally:
            DoExcel.write_back('test_data.xlsx', item['sheet_name'], item['mode'] + 1, str(res.json()), test_result)
            my_logger.error("获取到的结果是:{}".format(res.json()))

        print(res.json())

suite:

import unittest
import HTMLTestRunner

suite = unittest.TestSuite()
loader = unittest.TestLoader()


from class_api_tow.class_demo_1 import Http_Requests
suite.addTest(loader.loadTestsFromTestCase(Http_Requests))


with open('data.html', 'wb') as file:
    runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None)
    runner.run(suite)

一行代码搞定unittest运行机制:

替换unittest的三行代码:

case_lib 为模块名字!
例如:from interface_auto_lib import case_lib

suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(case_lib))

suite = unittest.defaultTestLoader.discover(r'路径模块名,不需要.py')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中unittest+ddt的应用 的相关文章

  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • django 中的身份验证方法返回 None

    你好 我在 django 中做了一个简单的注册和登录页面 当想要登录时 登录视图中的身份验证方法不返回任何内容 我的身份验证应用程序 模型 py from django db import models from django contri
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 目录 'app/static' 不存在

    当我运行 server py 文件时出现错误 File C Users nawin AppData Local Programs Python Python38 lib site packages starlette staticfiles
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何使用logging.conf文件使用RotatingFileHandler将所有内容记录到文件中?

    我正在尝试使用RotatingHandler用于 Python 中的日志记录目的 我将备份文件保留为 500 个 这意味着我猜它将创建最多 500 个文件 并且我设置的大小是 2000 字节 不确定建议的大小限制是多少 如果我运行下面的代码
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 为什么我的 PyGame 应用程序根本不运行?

    我有一个简单的 Pygame 程序 usr bin env python import pygame from pygame locals import pygame init win pygame display set mode 400
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包

随机推荐

  • CSS中如何实现文字描边效果(Text Stroke)?

    聚沙成塔 每天进步一点点 专栏简介 文字描边效果 Text Stroke 示例 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅 这个专栏是为那些对
  • 手把手接入【微信测试公众号】,不会还有人不会调试公众号吧?

    仅使用微信的测试公众号 Java开发内容 遇错与参考 Java接入测试微信公众号调试流程 前提 创建并配置测试号 登陆注册微信测试公众号 沙箱 微信验签 免登授权获取用户信息 微信接口调试工具的使用 创建服务号菜单 常见错误 invalid
  • 最高月薪15K! 这个30岁的奶茶店老板说:这次转行,转对了!

    人生没有一成不变的风景 这一路上 我们会走过晴天 也会踏过泥泞 会穿越风雨 也将沐浴暖阳 不同的年龄 有不同的风景 不同的阶段 有不同的境遇 也许每个人的经历不同 对人生的感受也各异 但只要内心强大 不断让自己淬炼成长 就能从容面对人生 行
  • Yii Framework 开发教程(47) 主题 Theme 示例

    Theming是一个在Web应用程序里定制网页外观的系统方式 通过采用一个新的主题 可以非常方便的改变应用的外观 在Yii 每个主题由一个目录代表 包含view文件 layout文件和相关的资源文件 如图片 CSS文件 JavaScript
  • 1、安装配置

    一 安装 这里以Redis 5 0 5版本为例 实际安装过程中 可以去官网下载最新的稳定版本 官网地址 http redis io download wget http download redis io releases redis 5
  • 内核启动过程中对CPU型号的确认

    1 内核为什么要确认CPU型号 内核和CPU都是不断发展的 内核会不断的更新版本 CPU会不断的出新型号 每当厂商推出一款新的CPU都需要移植内核 使内核能在新款CPU上运行 如果我们将没有针对该款CPU移植过的内核放到该款CPU上运行 结
  • Linux定时器

    Linux定时器的实现主要用到itimerval结构体以及setitimer产生的信号 系统随使用signal信号处理函数来处理产生的定时信号 从而实现定时器 itimerval结构体说明 struct itimerval Value to
  • [谦实思纪 02]整理自2023雷军年度演讲——《成长》(下篇)创业之旅(创业与成长)

    文章目录 谦实思纪 整理自2023雷军年度演讲 成长 下篇 创业之旅 创业与成长 0 写在前面 1 创业 创业与成长 1 1 找互补的朋友一起干 更容易成功 1 2 创业中必须要有领导者 核心思维 1 3 从失败开始 学海无涯 1 4 金山
  • STM32G070进行flash读写操作

    STM32G070的flash读写问题 STM32G070xx的flash分布如下图 打算将Page 63用于保存用户数据 问题 开始一直出现flash写入失败 从返回码来看是FLASH FLAG PGSERR 一直找不到原因 代码如下 d
  • android throw exception 原理,Android Throw Exception

    It depends if this Close can throw an exception then it still needs to be declared as being thrown or caught Often times
  • grid常用属性及属性值介绍

    文章目录 前言 一 grid布局是什么 二 常用简写 必会 2 1 grid 2 2 gap grid gap 2 3 grid area 2 4 grid template 2 5 place content 2 6 place item
  • 1359: [Baltic209]Candy

    题目链接 题目大意 tan90 题解 不存在的 我的收获 如何快速升级
  • protobuf与protoc-gen-go

    什么是protobuf Protobuf Protocol Buffer 是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了多种语言的实现 java c c go 和 python 每一种实现都包含了相应语
  • Jmeter接口测试+压力测试

    jmeter是apache公司基于java开发的一款开源压力测试工具 体积小 功能全 使用方便 是一个比较轻量级的测试工具 使用起来非常简单 因为jmeter是java开发的 所以运行的时候必须先要安装jdk才可以 jmeter是免安装的
  • OkHttp的使用之{RequestBody、FormBody、MultipartBody}

    目录 0 相关文章 1 POST请求 1 1 RequestBody json数据提交 1 2 FromBody 表单提交 这种能满足大部分的需求 1 3 MultipartBody 文件上传 1 4 图片下载 文件下载 0 相关文章 Ok
  • 布隆过滤器(Bloom Filter)

    1 引言 通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景 一般想到的是将集合中所有元素保存起来 然后通过比较确定 链表 树 散列表 又叫哈希表 Hash table 等等数据结构都是这种思路 但是随着集合中元素的增加 我们需要的
  • 线程相关面试题

    1 ThreadPoolExecutor 线程池执行 有哪些常用的方法 1 执行线程池 submit excute 2 终止线程池 shutdown 3 判断线程是否终止 isShutdown 4 获取正在运行的线程数 getAcitive
  • 详解Python中字符串前“b”,“r”,“u”,“f”的作用

    1 字符串前加 u 例 u 我是含有中文字符组成的字符串 作用 后面字符串以 Unicode 格式 进行编码 一般用在中文字符串前面 防止因为源码储存格式问题 导致再次使用时出现乱码 2 字符串前加 r 例 r n n n n 表示一个普通
  • 视频稳像(Video Stabilization)

    原文 https blog csdn net hjl240 article details 52683738 开源 关键词 Video Stabilization 不错 https github com yaochih awesome vi
  • python中unittest+ddt的应用

    一 单个EXCEL执行 import unittest from class api login topup demo import http request from class api login topup http attr imp