DRF对Django请求响应做了技术升级

Django视图是用来处理请求和响应的,Django默认是按Form和Template来设计的,如果要处理以JSON格式为主的RESTful API,那么就需要对Django请求和响应的处理代码进行优化改造,本文就来介绍DRF在这一部分的技术升级。

JavaWeb开发基础Servlet事件和监听器

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 事件和监听器 事件是指在程序运行过程中发生的特定动作或情况。比如: 用户操作,如点击按钮、输入文本 系统操作,如文件读取完成、网络连接断开 应用程序内部的状态变化,如对象属性改变、方法调用 监听器是一个接口或类,用于定义在特定事件发生时要执行的操作。监听器会“监听”特定的事件,当事件发生时,监听器中的相应方法会被调用,从而执行预定义的操作。 事件和监听器是相辅相成的,它们的工作原理如下: 事件源:触发事件的来源。例如,按钮是事件源,点击按钮会触发点击事件 事件对象:当事件发生时,事件源会创建一个事件对象,包含有关事件的信息 注册监听器:监听器需要注册到事件源,以便监听特定的事件。注册后,事件源会在事件发生时通知监听器 事件处理:当事件发生时,事件源会调用监听器中的相应方法,传递事件对象,从而执行预定义的操作 Servlet Event Class 事件(Event)是一个类,封装了与特定事件相关的信息。 基本是构造方法和get方法: ServletRequestEvent public class ServletRequestEvent extends EventObject { private static final long serialVersionUID = 1L; private final ServletRequest request; public ServletRequestEvent(ServletContext sc, ServletRequest request) { super(sc); this.request = request; } public ServletRequest getServletRequest() { return this.request; } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletRequestAttributeEvent public class ServletRequestAttributeEvent extends ServletRequestEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) { super(sc, request); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ServletContextEvent public class ServletContextEvent extends EventObject { private static final long serialVersionUID = 1L; public ServletContextEvent(ServletContext source) { super(source); } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletContextAttributeEvent public class ServletContextAttributeEvent extends ServletContextEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletContextAttributeEvent(ServletContext source, String name, Object value) { super(source); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } HttpSessionEvent public class HttpSessionEvent extends EventObject { private static final long serialVersionUID = 1L; public HttpSessionEvent(HttpSession source) { super(source); } public HttpSession getSession() { return (HttpSession) super.getSource(); } } HttpSessionBindingEvent public class HttpSessionBindingEvent extends HttpSessionEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public HttpSessionBindingEvent(HttpSession session, String name, Object value) { super(session); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ...

Java单元测试Mock框架Mockito入门介绍

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 鸡尾酒 Mockito是Java的单元测试Mock框架。它的logo是一杯古巴最著名的鸡尾酒Mojito,Mojito鸡尾酒,源自古巴的哈瓦那,带有浓厚的加勒比海风情。并不浓烈,但是喝一杯下去,脸上会泛起红晕,象少女的羞涩。味道很清新,有一点青涩、有点甜蜜。 Stub & Mock Stub和Mock是Test Double类型中的2种。Test Double一共有5种类型,Dummy,Stub,Spy,Mock,Fake。 Test Double是测试复制品,用来统称模拟真实对象的假对象。因使用场景有略微不同,而有这5种类型。 Dummy,通常只用来填充参数列表。有可能是null对象引用,或Object类实例等。 Fake,是简化版的实现,比如基于内存实现的数据库,不会真的去做数据库操作,用简单的HashMap来存放数据。 Stub,Stub用来替代SUT(System Under Test)依赖的组件,但是只模拟一个外部依赖,不做断言。 Spy,介于Stub和Mock之间。如果真实对象没有被打桩,当调用Spy对象时,真实对象也会被调用。 Mock,可以理解为Stub+Verification,既模拟外部依赖,也会定义预期结果。 看一个实例,发送邮件, public interface MailService { public void send(Message msg); } 先写个Stub, public class MailServiceStub implements MailService { private List<Message> messages = new ArrayList<Message>(); public void send(Message msg) { messages.add(msg); } public int numberSent() { return messages.size(); } } 实现Stub的状态验证, class OrderStateTester… public void testOrderSendsMailIfUnfilled() { Order order = new Order(TALISKER, 51); MailServiceStub mailer = new MailServiceStub(); order.setMailer(mailer); order.fill(warehouse); assertEquals(1, mailer.numberSent()); } 只做了简单的测试,断言发出了1封邮件。没有测试是否发送给了对的收件人,或者邮件正文是否正确。不过不影响跟Mock比较。 ...

Java官方笔记5数字和字符串

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Numbers Number的子类: 另外还有BigDecimal和BigInteger,用于高精度计算,AtomicInteger和AtomicLong用于多线程应用。 我们有时候需要用包装类而非基本数据类型,理由如下: 方法入参类型为Object,只能传入对象 使用包装类提供的常量,比如MIN_VALUE和MAX_VALUE 使用包装类的方法来做类型转换 format import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n); // --> "461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06" } } DecimalFormat ...

JMeter四种参数化方式

JMeter参数化是指把固定的数据动态化,这样更贴合实际的模拟用户请求,比如模拟多个不同账号。JMeter一共有四种参数化方式,分别是:

SpringBoot官方笔记5Data

Spring Boot integrates with a number of data technologies, both SQL and NoSQL.

teprunner测试平台用例编写等体验响应式升级

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 本文开发内容 在免费开源的测试平台中,teprunner的UI界面应该算得上第一梯度了,BUT,美中不足,在不同分辨率显示器(比如13.3寸小屏笔记本)下布局大的弹出窗口,表现不尽如人意。而这又是核心功能代码编辑的界面,比如用例编写、fixture编写,很有必要优化升级。除此之外还有滚动条的问题:竖向双滚动条和横向滚动条,也对体验造成影响。本文将对这些内容进行改造,具体如下: 编写用例页面,从弹窗改为子页面。 编写fixture页面,从弹窗改为子页面。 代码编辑区域高度自适应。 缩小左侧菜单,移动项目环境和新增按钮同一行,扩大编辑区面积。 消除所有双向滚动条。 消除所有横向滚动条。 语法说明添加环境变量和fixtures示例代码。 其他细节优化。 响应式是指同一套前端代码在不同浏览器(PC端、移动端等)都能适配,Element UI已经是响应式设计了,本文的响应式体现在代码编辑区行高根据window.innerHeight自动计算设定。 升级效果展示 左侧菜单栏变窄;添加环境变量和fixtures示例代码。 项目环境和新增按钮同一行显示,扩大有效内容可视面积。 fixtures的新增和编辑从弹窗改为子路由页面,代码编辑区高度自适应,纵向滚动条只出现一个。 消除横向滚动条;缩小了用例描述列以外其他列宽;替换操作按钮文字为图标。 用例的新增和编辑从弹窗改为子路由页面,代码编辑区高度自适应,纵向滚动条只出现一个。 用例运行结果的新增和编辑从弹窗改为子路由页面,代码编辑区高度自适应,纵向滚动条只出现一个。 测试计划的新增,编辑,运行结果也做了相同调整。 整体而言,有效信息的可视面积和可操作面积都尽可能扩大了! 关键技术点 前端代码修改文件如下: 比较繁琐,没有新知识,这里就不一一讲解了,而是选择用到的关键技术点来进行知识回顾: template添加<router-view></router-view> 主页面div添加v-if="$route.name === 'name'" 在router/index.js中添加children子路由 跳转页面前,存localStorage 新页面create()时,取localStorage this.$router.push跳转路由 div同行显示用float: left,紧跟的div换行用clear: both window.innerHeight获取屏幕高度 小结 本文完成了对teprunner测试平台前端UI界面的体验升级,已经适配13.3寸到27寸显示器,如果还在担心不好用的话,那么现在可以好好试试了。定时任务从目前优化效果来看,已经趋于稳定,不久就会和大家见面。 参考资料: Element UI图标按钮样式 https://www.jianshu.com/p/a81cd965943c

tep集成HttpRunner与Flask实现开箱即用

大家好,我是刚哥。

2026-01-08 · 2 分钟 · 403 字 · 测试开发刚哥 · 原创项目 · #Tep

魔法方法推开Python进阶学习大门

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 热爱Python Python是Guido van Rossum设计出来的让使用者觉得如沐春风的一门编程语言。2020年11月12日,64岁的Python之父宣布由于退休生活太无聊,自己决定加入Microsoft的DevDiv Team,致力于“确保更好地使用Python”。尽管在国内有些声音在Diss着Python,认为它太简单,只是个脚本语言,但是它的发明者对Python的热情,仍然激励着我们坚持对Python的热爱。 龟叔是所有编程语言发明者当中头发最多的这位。 奇迹时刻 collection.len()是面向对象语言的写法,len(collection)是Python语言的写法,这种风格叫做Pythonic。从前者到后者,就像变魔术一样,一瞬间让人眼前一亮。这个魔术就是Python魔法方法,或者叫双下方法,它是用双下划线开头和双下划线结尾的特殊方法,比如obj[key],Python解释器实际上会转换成obj.__getitem__(key)来运行,但是使用者并无感知。 __getitem__和__len__ __getitem__用来获取数据,__len__用来返回长度,这2个魔法方法是Python基础,我们通过一副扑克牌来了解: import collections # 定义一副牌 Card = collections.namedtuple('Card', ['rank', 'suit']) class FrenchDeck: # 大小 ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 花色 suits = 'spades diamonds clubs hearts'.split() def __init__(self): # 生成一副牌 self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] def __len__(self): return len(self._cards) def __getitem__(self, position): return self._cards[position] 本来我们对这副牌什么都不能做,但是由于实现了__len__,可以使用len()函数查看有多少张牌: >>> len(deck) 52 由于实现了__getitem__,可以使用中括号索引取值: >>> deck[0] Card(rank='2', suit='spades') 能进行切片: >>> deck[:3] [Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')] >>> deck[12::13] [Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')] 能迭代: ...

如何构建“测试开发体系”

构建知识体系,首先需要具备写作习惯和写作能力。笔记的重点是记录,需要养成记笔记的习惯,把知识保存下来。良好的写作能力,可以将复杂的概念用文字清晰表达,具有逻辑性和条理性。知识体系的展现形式,不只是脑图,还包括文档、幻灯片、流程图等,既要会写又要会画,通过多种形式将知识呈现出来。