80道高频算法题Java版

80道常考算法题,逢考必过,剑指offer。

Android测试三件套:传文件、抓包、看日志

在对安卓进行测试时,我们需要把 apk 传到安卓机上,对请求抓包,同时监控应用日志。本文就来讲讲具体操作。

Claude Code使用技巧帮你提效80%

Claude Code是Anthropic公司的产品,跟字节的豆包、阿里的千问和腾讯的元宝一样,只不过它更擅长于跟代码打交道。用Claude Code来写代码,就是通常说的Vibe Coding,跟着感觉编程。

2026-01-02 · 1 分钟 · 37 字 · 测试开发刚哥 · AI技术 · #AI测试

Django搭建示例项目实战与避坑细节

Django 开发项目是很快的,有多快?看完本篇文章,你就知道了。

FastAPI官方教程太棒了(下)

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 响应状态码 在@app.post()方法中添加status_code参数: from fastapi import FastAPI app = FastAPI() @app.post("/items/", status_code=201) async def create_item(name: str): return {"name": name} status_code也可以是IntEnum,比如Python的http.HTTPStatus。 常见响应状态码: 100以上,信息;很少直接使用; 200以上,成功;200是OK,201是Created,204是No Content; 300以上,重定向;304是Not Modified; 400以上,客户端错误;404是Not Found; 500以上,服务器错误; FastAPI引入了status,可以方便的录入这些状态: from fastapi import FastAPI, status app = FastAPI() @app.post("/items/", status_code=status.HTTP_201_CREATED) async def create_item(name: str): return {"name": name} 表单数据 为了使用表单,首先需要安装python-multipart: pip install python-multipart 示例: from fastapi import FastAPI, Form app = FastAPI() @app.post("/login/") async def login(username: str = Form(), password: str = Form()): return {"username": username} 表单由HTML中的<form></form>发送,请求头的content-type一般是application/x-www-form-urlencoded,当为文件时multipart/form-data。 请求文件 示例: from fastapi import FastAPI, File, UploadFile app = FastAPI() @app.post("/files/") async def create_file(file: bytes = File()): return {"file_size": len(file)} @app.post("/uploadfile/") async def create_upload_file(file: UploadFile): return {"filename": file.filename} create_file()的类型为bytes,接收到的文件内容也是bytes,数据都存在于内存中,适用于小文件。create_upload_file()的类型为UploadFile,它会在内存设置一个最大存储,超出最大存储,就会把数据转存到磁盘,适用于大文件。 ...

HttpRunner3的HTTP请求是怎么发出去的

在HttpRunner3的示例代码中,发送HTTP请求的代码是这样写的:

JavaWeb开发基础Servlet简介

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Servlet是什么? 现在的Java Web开发,很少直接接触到Servlet。在Spring项目中,Spring Boot基于Spring Framework,简化了Spring应用程序开发,Spring Framework是一个全面的Java应用程序框架,其中包含Spring MVC模块,Spring MVC封装了Servlet,以实现Web功能。Servlet不属于Spirng项目,而是Java EE(后改名为Jakarta EE)的一部分。 Oracle将Java EE(Java SE还自己保留)交给开源组织,Eclipse基金会接手。但Oracle不允许开源组织使用Java名号,所以Jakarta EE名称于2018.02.26应运而生。 Servlet可以有很多种描述: Servlet是一个技术,用来创建Web应用程序 Servlet是一个API,提供了很多接口、类和文档 Servlet是一个接口,必须实现该接口来创建Servlet Servlet是一个类,位于服务端,接收请求,返回响应 Servlet是一个Web组件,用来创建动态Web页面 CGI与Servlet 在Servlet技术出现以前,Web应用程序是通过CGI(Common Gateway Interface),一种脚本语言,来实现的。 但是CGI存在很多缺点: 如果客户端增多,服务端响应会变慢 对于每个请求,CGI都会创建一个进程,进程数有限 依赖C、C++、perl等编程语言 Servlet技术出现以后,解决了很多CGI问题: 性能:每个请求创建一个线程,而不是进程 可移植性:因为使用了Java语言 健壮性:JVM管理Servlet,无需关心内存泄漏、垃圾回收等 安全性:因为使用了Java语言 总的来说,Servlet是Server Applet,服务端小程序。它是单例多线程的,每个Servlet类在Web容器中只有一个实例,每次客户端请求,Web Server都会从线程池中分配一个线程去创建Servlet,每个请求由一个独立的线程处理,这些线程共享同一个Servlet实例,通过HTTP协议接收和响应来自Web Client的请求。 参考资料: https://www.javatpoint.com/servlet-tutorial

Java高级编程精华笔记

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 学习路线 本文是Java高级编程精华笔记,是对菜鸟教程中Java面向对象和Java高级编程的重要章节进行了学习,整理形成的学习笔记,知识图谱如下图所示: 如果想对Java深入学习,可以参考阿里巴巴的技术图谱: https://developer.aliyun.com/graph/java 继承 Java使用extends关键字来声明继承: class 父类 { } class 子类 extends 父类 { } 示例,子类企鹅和子类老鼠继承父类动物: //父类:动物 public class Animal { private String name; private int id; public Animal(String myName, int myid) { name = myName; id = myid; } public void eat() { System.out.println(name + "正在吃"); } public void sleep() { System.out.println(name + "正在睡"); } public void introduction() { System.out.println("大家好!我是" + id + "号" + name + "."); } } //子类:企鹅 public class Penguin extends Animal { public Penguin(String myName, int myid) { super(myName, myid); } } //子类:老鼠 public class Mouse extends Animal { public Mouse(String myName, int myid) { super(myName, myid); } } Java只支持单继承,不支持多继承,但可以多重继承: ...

JMeter是如何运行施压的

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 运行文件 JMeter下载地址为: https://jmeter.apache.org/download_jmeter.cgi 最新版本为5.4.1,依赖于Java8+,下载后无需安装,解压即用。解压后的目录和文件如下: bin 二进制文件目录,包括配置文件、启动文件、启动jar包、示例脚本。比如Windows和Linux系统的两个启动脚本: docs API离线帮助文档。 extras 辅助功能,可用于Ant、Jenkins集成。 lib lib根目录下存放JMeter基础jar包,lib/ext目录下存放第三方或自定义扩展jar包。 licenses 证书文本文件。 printable_docs 离线帮助文档。 LICENSE 证书说明。 NOTICE 版权声明。 README 简介。 测试计划 JMeter以图形界面方式启动后,首先映入眼帘的是左侧的TestPlan,测试计划: JMeter的UI界面只能同时编辑一个测试计划,如果想再编辑另外一个测试计划,必须再打开一个JMeter界面。这是因为测试计划对应的是.jmx文件!不同的.jmx文件只能在不同的界面中编辑。 JMeter界面是通过组件拖拽的方式来编写脚本的,脚本的根目录是测试计划。根节点只能有一个,作为根节点,测试计划很适合来做全局配置,比如在User Defined Variables处添加键值对格式的全局变量。 测试计划是默认节点,JMeter还有另外一个不可缺少的次节点:Thread Group,线程组。 多线程 性能测试工具的目的是用少量电脑产生成百上千个并发请求。多进程和多线程正好能用来实现这个需求,书上有句关于进程和线程的至理名言:“进程是操作系统分配资源的最小单位,线程是程序执行的最小单位”。该如何理解呢?前一句的意思是说,每个应用程序都有对应的进程,按照进程来分配资源,可以使得资源利用最大化,避免浪费。后一句的理解得从一个故事讲起,很久以前,进程拿着资源找CPU执行。CPU一看进程太大,说我处理不了。进程只能拆成多个线程给CPU,不但能执行了,还能在线程之间灵活切换。 多进程和多线程都可以用来模拟并发请求。JMeter是用Java语言写的程序,运行在JVM虚拟机之上,进程的开销比线程大很多,JVM为了保证足够性能,控制了进程的数量。如果用多线程,单台电脑能提供了负载有限,那么就只能用多线程。JMeter只支持多线程! 另外一个性能测试工具LoadRunner支持多进程和多线程。 用户即线程 JMeter除了Thread Group,其他地方都是用的另外一个词:User。实际上它们是一个意思,用户就是线程。JMeter的运行原理就是用多个线程来模拟多个用户!以下是简单示例: 从图中可以看出,有两个线程组,Thread Group 1和Thread Group 2,它们分别定义了自己组内的用户要做的事情。不同线程组做的事情是不一样的,但是同一线程组内部做的事情是一模一样的。我们在写JMeter脚本的时候,实际上是在定义每个用户要做哪些事。当运行脚本的时候,JMeter会启动多个线程,都来执行这个脚本,按照我们写的进行执行。 由于每个线程启动时间不一样,线程执行时资源环境也有区别,导致线程的执行进度并不完全一致,比如一些线程已经登录完了,另一些线程可能才刚开始登录。后面的文章会给出一些解决办法。 远程运行 一台机器提供了线程数量有限,如果想要施压更大的并发,那么就需要多台机器。JMeter天然支持多台机器并发: 控制机和负载机本质上没有区别,同一台机器既可以做控制机,也可以做负载机,取决于你的负载设计。控制机的作用是管理多台远程负载机,控制远程负载机脚本运行,收集远程负载机测试结果。负载机是实际产生并发的机器,它们向被测应用系统发起负载。 运行逻辑如下: 远程负载机启动Agent客户端,等待控制机连接。 控制机连接上远程负载机。 控制机发送指令到远程负载机启动线程。 远程负载机运行脚本,回传结果数据。 控制机收集结果并显示。 操作步骤如下: 远程负载机启动jmeter-server.bat。 在控制机bin\JMeter.properties文件中,修改remote_hosts,添加远程负载机的ip和port,多个远程负载机ip 用逗号分隔,如remote_hosts=192.168.0.1:1664,192.168.0.2:1664。1664是默认RMI端口号(Remote Method Invocation,远程方法调用)。 在控制机菜单栏Run执行Remote命令: 如果远程负载机需要参数或jar包,可以手动先把环境准备好,也可以使用自动化工具在脚本运行前从控制机发送到远程负载机。 小结 本文先从JMeter运行文件讲起,启动后默认有测试计划,建线程组,线程即用户,用多线程来模拟多用户,这就是JMeter运行起来施压的原理。为了解决单台机器负载能力有限的问题,JMeter还提供了远程运行方式,既可以在局域网用多台机器来控制,也可以部署到云服务器上,进行云压测。

JUnit5注解学习指引

注解(Annotations)是JUnit的标志性技术,本文就来对它的20个注解,以及元注解和组合注解进行学习。