测试开发常问面试题

Postman

Postman实现接口关联

  • 步骤
    • 通过正则表达式或则JSON提取器取值的方式,提取需要的参数。
    • 将参数设置为全局变量或则环境变量。
    • 在之后接口中,通过{{全局变量/环境变量}}代替要替换的参数值。
- JSON提取器方式
var jsonData = JSON.parse(responseBody);
pm.environment.set("token",jsonData.data.accessToken);
- 正则表达式
var jsonData = reponseBody.match(new RegExp('"accessToken":(*.?)'));
pm.globals.set("token",jsonData[1])

Postman实现参数化

  • 内置函数。
    • {{$randomint}}:添加0-1000之间的随机整数。
    • {{$guid}}:添加一个V4风格的GUID
    • {{$timestamp}}: 添加当前的时间戳,精确到秒
    • {{$randomFullName}}:随机全名(名字 姓氏)
    • {{ $randomBoolean}}: 随机布尔值 (true/false)
  • Pre-request-Script页签中使用代码实现
    • 前置脚本设置自定义变量。
  • 全局变量/环境变量/Collection变量
    • 后置脚本设置提取变量。
  • CSV/JSON文件。
    • 关键点1:{{变量名}}:变量名同CSV第一行设置的变量名和JSON文件设置变量名。
    • 关键点2:通过Run Configuration->Data导入文件->设置Iterations。

Jmeter

Jmeter实现接口关联

  • 步骤
    • 在测试计划中添加一个线程组,然后添加取样器。
    • 对线程组右键添加后置处理器→正则表达式提取器/JSON提取器/Xpath提取器。

在这里插入图片描述

  • APPly to:作用范围:
    • Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
    • Main sample only:仅作用于父节点的取样器
    • Sub-samples only:仅作用于子节点的取样器
    • JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
  • 要检查的响应字段:
    • Body(unescaped):主体
    • Body as a Document:从不同类型的文件中提取文本
    • Response Headers:响应信息头
    • Request Headers:请求信息头
    • URL:统一资源定位符
  • 模板:
    • $0$代表这一组结果的全部,
    • $1$代表这一组结果的第1个,以此类推;
    • $1$$2$代表该正则表达式一组结果中的第1个和第2个,俩结果挨在一起中间没有间隔;
    • $3$,$4$代表该正则表达式一组结果中的第3个和第4个,俩结果间有一个逗号相连。

在这里插入图片描述

  • Variable names : 名称
  • JSONPath Expression:JSON表达式
  • Match Numbers:匹配哪个,可为空即默认第一个
  • Default Value:未取到值的时候默认值
  - 正则表达式提取器
    -  `<title>百度一下,你就知道</title><title>百度一下,你就知道</title>` -> `<title>(.*?)</title>`
    - `021-1234-1234`->`(.*?)-(.*?)-(.*?)\n`
  - XPath提取器
    - `//a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)`
    - ` //a : 找出所有的a标签`
  - JSON提取器

Jmeter实现参数化

  • 用户定义的变量:

    • 作用:定义全局变量。
    • 局限性:每次取值(无论是否相同的用户)都是固定值。
  • 用户参数:

    • 作用:保证不同的用户针对同一组参数,可以取到不同的值。
    • 局限性:同一个用户在多次循环时,取到相同的值。
  • csv数据文件设置:

    • 作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值。
    • 局限性:需要手动进行测试数据的设置。
  • 函数:

    • 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置
    • 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)

Selenium参数化

import json
import time
import unittest
from parameterized import parameterized
from ddt.tpshop import utils
from ddt.tpshop.page.login_page import LoginProxy
from ddt.tpshop.utils import DriverUtil
class TestLogin(unittest.TestCase):
	def build_data(self):
		test_data = []
		with open("../data/testData.json", encoding='UTF-8') as f:
		json_data = json.load(f)
		for login_data in json_data.values():
		test_data.append((login_data.get("username"),
		login_data.get("password"),
		login_data.get("code"),
		login_data.get("is_success"),
		login_data.get("expect")))
		print("test_data=", test_data)
		return test_data
	@classmethod
	def setUpClass(cls):
		cls.driver = DriverUtil.get_driver()
		cls.login_proxy = LoginProxy()
	@classmethod
	def tearDownClass(cls):
		DriverUtil.quit_driver()
	def setUp(self):
		# 进入首页
		self.driver.get("http://localhost")
		# 点击登录链接
		self.driver.find_element_by_link_text("登录").click()
	@parameterized.expand(self.build_data)
	def test_add(self, username, password, code, is_success, expect):
		print('username={} password={} code={} is_success={} expect={}'.
		format(username, password, code, is_success, expect))
		# 登录
		self.login_proxy.login(username, password, code)
		time.sleep(3)
		# 登录成功的用例
		if is_success:
		self.assertIn(expect, self.driver.title)
		else:
		# 获取提示框消息
		msg = utils.get_tips_msg()
		print("msg=", msg)
		self.assertIn(expect, msg)

Junit参数化

------------------------------------------------------
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void test_ValueSource(int i) {
	System.out.println(i);
}
------------------------------------------------------
@ParameterizedTest
@EnumSource(ElementType.class)
void test_EnumSource(ElementType et) {
	System.out.println(et);
}
------------------------------------------------------
@ParameterizedTest
@EnumSource(value = ElementType.class, names = { "TYPE", "METHOD", "FIELD" })//如果只需要Enum中的特定值,则可以使用EnumSource name参数来实现。
void test_EnumSource_Extended(ElementType et) {
	assertTrue(EnumSet.of(ElementType.FIELD, ElementType.TYPE, ElementType.METHOD).contains(et));
}
------------------------------------------------------
@ParameterizedTest
@MethodSource("ms")
void test_MethodSource(String s) {
	assertNotNull(s);
}
static Stream<String> ms() {
	return Stream.of("A", "B");
}
------------------------------------------------------

@ParameterizedTest
@CsvSource(delimiter='|', value= {"1|'A'","2|B"})
void test_CsvSource(int i, String s) {
	assertTrue(3 > i);
	assertTrue(Arrays.asList("A", "B", "C").contains(s));
}
-----------------------------------------------------
@ParameterizedTest
@CsvFileSource(resources = "/country_code.csv", numLinesToSkip = 1)
void test_CsvFileSource(String country, int code) {
    assertNotNull(country);
    assertTrue(0 < code);
}
------------------------------------------------------

SpringBoot

(1)常用注解

  • 引导类:
    • @SpringBootApplication
      • @SpringBootConfiguration
      • @EnableAutoConfiguration
      • @ComponentScan
  • 表现层:
    • @RestController
      • @ResponseBody
      • @Controller
    • @RequestMapping
      • @PostMapping
      • @PutMapping
      • @PostMapping(“/status/0”)
      • @DeleteMapping
    • @Autowired
  • 业务层:
    • @Service
  • 数据层;
    • @Mapper
  • 全局异常处理;
    • @ControllerAdvice(annotations = {RestController.class, Controller.class})//表示这是一个aop通知类,做功能增强。
    • @ResponseBody//类中方法返回值将以JSON格式返回给前端。

(2)如何实现分页功能

  • 为了使用Mybatis-plus提供的分页接口,由于mybatis-plus基于AOP思想仅仅只是对mybatis功能进行增强,因此需要使用分页拦截器,拦截所有查询请求,并使用代理的方式,使用Mybatis-plus提供的接口完成自动分页功能。(mybatis-plus将会注入MybatisPlusInterceptor类型对象,如果没有添加任何拦截器,将不会拦截任何请求)
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

@RestController
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {
    @Autowired
    private IEmployeeService employeeService;
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name){
        log.info("page = {},pageSize = {},name = {}" ,page,pageSize,name);
        //创建一个分页构造器,使用mybatisplus提供的实体。
        Page pageInfo = new Page(page,pageSize);
        //创建一个条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
        //添加过滤条件,使用带bool类型的lambda表达式。
        queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
        //添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdate_time);
        //执行查询
        employeeService.page(pageInfo,queryWrapper);
        return R.success(pageInfo);
  • 总结:
    • 构造一个MybatisPlus分页拦截器,交给SpringBoot管理。
    • 创建一个MybatisPlus提供的分页构造器。
    • 创建一个MybatisPlus提供的条件构造器,然后添加条件。
    • 调用MybatisPlus提供的接口page执行查询。
    • 返回分页构造器Records中存储着我们想要的分页数据。

(3)解决跨域问题

  • 当前浏览器加载页面的URL与当前页面请求的URL不一致(协议/域名/端口不同)。
  • 使用@CossOringe解决,一般加载表现层。

(4)MybatisPlus常用注解

  • @TableId
  • @TableField
  • @TableLogic
  • @Version
  • @OrderBy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/8244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring6】数据校验:Validation

10、数据校验&#xff1a;Validation 10.1、Spring Validation概述 在开发中&#xff0c;我们经常遇到参数校验的需求&#xff0c;比如用户注册的时候&#xff0c;要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式&#xff0c…

TenserRT(三)PYTORCH 转 ONNX 详解

第三章&#xff1a;PyTorch 转 ONNX 详解 — mmdeploy 0.12.0 文档 torch.onnx — PyTorch 2.0 documentation torch.onnx.export 细解 计算图导出方法 TorchScript是一种序列化和优化PyTorch模型的格式&#xff0c;将torch.nn.Module模型转换为TorchScript的torch.jit.Scr…

unicloud 模糊查询解决方案

序 1、where和aggregate的模糊搜索 2、第一种是“你好”去匹配“你好啊大家” 3、第二种是“家啊”去匹配“啊&#xff01;你家呢” 只要有1个字匹配就匹配 4、第三种是“家啊”去匹配“啊&#xff01;你家呢” 必须有“家”又有“啊”才匹配” 想看效果&#xff0c;大家可以自…

ROBOGUIDE教程:FANUC机器人摆焊焊接功能介绍与虚拟仿真操作方法

目录 摆焊功能简介 摆焊指令介绍 摆焊功能设置 摆焊条件设置 机器人摆焊示教编程 仿真运行 摆焊功能简介 使用FANCU机器人进行弧焊焊接时&#xff0c;也可以实现摆动焊接&#xff08;简称摆焊&#xff09;。 摆焊功能是在机器人弧焊焊接时&#xff0c;焊枪面对焊接方向…

面试字节,三面HR天坑,想不到自己也会阴沟里翻船....

阎王易见&#xff0c;小鬼难缠。我一直相信这个世界上好人居多&#xff0c;但是也没想到自己也会在阴沟里翻船。我感觉自己被字节跳动的HR坑了。 在这里&#xff0c;我只想告诫大家&#xff0c;offer一定要拿到自己的手里才是真的&#xff0c;口头offer都是不牢靠的&#xff0…

【CE】Mac下的CE教程Tutorial:进阶篇(第8关:多级指针)

▒ 目录 ▒&#x1f6eb; 导读开发环境1️⃣ 第8关&#xff1a;多级指针翻译操作验证其它方案&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x1f6eb; 导读 开发环境 版本号描述文章日期2023-03-操作系统MacOS Big Sur 11.5Cheat Engine7.4.3 1️⃣ 第8关&#xff1a;多…

MySQL数据库中的函数怎样使用?

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么&#xff0c;函数到底在哪儿使用呢? 我们先来看两个场景&a…

【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

&#x1f389;欢迎来到FPGA专栏~基于FPGA的循迹小车 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

Android下载apk并安装apk(用于软件版本升级用途)

软件版本更新是每个应用必不可少的功能&#xff0c;基本实现方案是请求服务器最新的版本号与本地的版本号对比&#xff0c;有新版本则下载apk并执行安装。请求服务器版本号与本地对比很容易&#xff0c;本文就不过多讲解&#xff0c;主要讲解下载apk到安装apk的内容。 一、所需…

Socket套接字编程(实现TCP和UDP的通信)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

(链表)移除链表元素(双指针法)

文章目录前言&#xff1a;问题描述&#xff1a;解题思路&#xff08;双指针法&#xff09;&#xff1a;代码实现&#xff1a;总结&#xff1a;前言&#xff1a; 此篇是针对链表的经典练习题。 问题描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请…

Js:apply/call/bind、作用域/闭包、this指向(普通,箭头,JS/Vue的this)

目录1、apply/call/bind2、作用域、作用域链和闭包核心1、预处理&#xff08;解析阶段&#xff09;——JS执行“代码段”之前2、生成执行上下文环境——对代码段(全局/函数体)进行处理3、执行上下文环境小结4、多个执行上下文环境5、作用域6、作用域和执行上下文7、从【自由变量…

小米万兆路由器里的 Docker 安装 Gitea

小米万兆路由器里的 Docker 安装 Gitea准备工作创建存储查看Docker Hub镜像信息拉取 gitea 镜像和运行容器配置通过 ssh 访问(Optional)其他小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用Docker。 今天尝试在小米的万兆路由器里安装Gitea。 准备工作 先将一块US…

Java企业级开发学习笔记(2.1)MyBatis实现简单查询

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/zi0wB】 文章目录零、创建数据库与表一、基于配置文件方式使用MyBatis基本使用1.1 创建Maven项目 - MyBatisDemo1.2 在pom文件里添加相应的依赖1.3 创建与用户表对应的用户实体类 - User1.4 创建用…

没有他们,人工智能只能死翘翘

我过去写过一篇文章《很多所谓伟大的贡献&#xff0c;其实都是狗屎运》&#xff0c;今天我也写写人工智能。&#xff08;1&#xff09;人才深度神经网络如果不从明斯基和罗森布拉特说起&#xff0c;那就应该可以从1965年Ivakhnenko发明前馈神经网络说起。但关键里程碑是出自Rum…

SpringBoot2核心功能 --- 原理解析

一、Profile功能 为了方便多环境适配&#xff0c;springboot简化了profile功能。 1.1、application-profile功能 默认配置文件 application.yaml&#xff1b;任何时候都会加载指定环境配置文件 application-{env}.yaml激活指定环境配置文件激活 命令行激活&#xff1a;java -…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II&#x1f60e;前言&#x1f64c;环形链表 II&#x1f64c;画图分析&#xff1a;&#x1f60d;思路分析&#xff1a;&#x1f60d;源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客…

STM32与Python上位机通过USB虚拟串口通信

文章目录前言1. 查看原理图2. 新建工程3.添加代码与烧录4. python代码编写总结问题解决思路前言 在详细阅读广大网友的教程之后&#xff0c;我对STM32和Python通过USB通信的流程烂熟于心。 尝试用ST公司的NUCLEO-L476RG板子进行简单的回环通信测试&#xff0c;发现还是存在网上…

Linux·异步IO编程框架

hi&#xff0c;大家好&#xff0c;今天分享一篇Linux异步IO编程框架文章&#xff0c;对比IO复用的epoll框架&#xff0c;到底性能提高多少&#xff1f;让我们看一看。 译者序 本文组合翻译了以下两篇文章的干货部分&#xff0c;作为 io_uring 相关的入门参考&#xff1a; Ho…

【RocketMQ】顺序消息实现原理

全局有序 在RocketMQ中&#xff0c;如果使消息全局有序&#xff0c;可以为Topic设置一个消息队列&#xff0c;使用一个生产者单线程发送数据&#xff0c;消费者端也使用单线程进行消费&#xff0c;从而保证消息的全局有序&#xff0c;但是这种方式效率低&#xff0c;一般不使用…