1.测试人员发现bug
2.描述bug
测试版本
测试环境(设备,系统)
测试步骤
测试数据
预期结果
实际结果
附件(错误截图,错误日志)
测试方案,
3.开发人员确认是否是bug,是的话修改bug,并改bug状态为已经解决
4.不是的话 ,退回给测试人员并描述退回原因,或为设计如此,或为外部原因,或者不能重现。
5、 开发人员修改完成的bug,由测试人员进行验证,确认修改正确,关闭bug。
6、 验证未通过的bug重新激活,开发人员继续修改,直至验证通过,关闭bug。
7、 测试人员需要对开发人员退回的bug进行确认。
8、 确认不是bug关闭。
9、 如与开发人员意见不一致,认为是bug,需提交项目负责人仲裁。
10、项目负责人确认是bug由开发人员修改,不是bug由测试人员关闭。
参考: bug流程处理
源于:性能与压力测试
响应时间
tps(HTTP per second)
吞吐量
系统运行时占用的系统资源的情况
2.selenium原理(3个)
1.测试脚本:python,java编写脚本程序
2.浏览器驱动:不同的驱动对应不同的版本
3.浏览器:IE,Firefox,Chrome,Safari
参考自此处
定位元素的方式
1.id
2.name
3.class-name
4.tag-name
5.link-text
6.partial link text
7.xpath
8.css selector
1、初始化阶段 , 调用init()方法; 2、响应客户请求阶段, 调用service()方法; 3、终止阶段, 调用destroy()方法。
(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
参考此处
1**:请求正在处理
2**:请求成功
200:请求正在处理
204:请求处理成功,但没有任何资源返回给客户端,常用于单向通信
206: 请求成功,响应报文中包含由 Content-Range 指定范围的实体内容
3**:重定向,需要附加操作已完成请求
301:永久重定向,表示请求的资源已经永久的搬到了其他位置
302:临时重定向,表示请求的资源临时搬到了其他位置
303表示请求资源存在另一个URI,应使用GET定向获取请求资源
303功能与302一样,区别只是303明确客户端应该使用GET访问
304:资源已找到,但不满足条件
4**:客户端错误
400:请求存在语法或者参数错误,服务器不理解
403:对请求资源的访问被禁止
404:服务器找不多请求的资源
5**:服务器错误
500:服务器执行请求的时候出错
503:服务器无法处理请求,服务器正在维护或者超负载运行。
源自: 面试问题:常见的http状态码
一、继承(抽象类/普通类)类与实现接口的区别
1、继承抽象类,必须重写抽象类中所有抽象方法。
2、继承普通类,可以重写也可以不重写父类的方法。
3、实现接口则必须实现接口中的所有方法。(接口中的方法均为抽象方法)。
二、抽象类、接口的区别
1、类要被子类继承,接口要被子类实现。
2、接口里不能定义普通变量,而抽象类中可以,接口只能定义公共的静态常量。
3、抽象类里可以没有抽象方法,可以有普通方法,就算全是普通方法也没关系。
4、普通类和抽象类(它的实例化方式并不是通过普通的new方式来创建对象,而是通过父类的应用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。)可以实例化,接口不可以实例化。
原文链接: 原文链接
select * from [表A] where id in (select id from [表A] group by id having count(id) >1 )
/**
* User:yang
*/
public class ThreadDemo16 {
//饿汉模式
//实例创建出现在类加载阶段
static class Singleton {
//希望是单例类,只有一个实例
//县创建一个成员,保存唯一的实例
private static Singleton instanse = new Singleton();
//在提供方法获取实例
public static Singleton getInstance() {
return instanse;
}
//把构造方法私有,防止其他代码创建实例
private Singleton() {
}
}
public static void main(String[] args) {
//如何获取这个实力
Singleton singleton=Singleton.getInstance();
}
}
/**
* User:yang
*/
public class ThreadDemo17 {
//懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
}
}
/**
* User:yang
*/
public class ThreadDemo18 {
//线程安全版本懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
synchronized (Singleton.class){
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
}
}
/**
* User:yang
*/
public class ThreadDemo18 {
//线程安全版本懒汉模式
//创建实例是在第一次使用getinstance的时候,比饿汉模式迟
static class Singleton {
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
private Singleton() {
}
}
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
}
软件测试就是验证软件是否满足客户的需求
select count(studentid) from t_student;
看这个:linux
HashMap
hashmap是非线程安全的,多线程下可以用concurrentHashmap或者Collections.synchronized()来代替。
首先两种数据结构
数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易;
HashTable
hashtable的数据结构和hashmap几乎相同
hashtable和hashmap的主要区别是
1.hashtable线程安全,内部的相关读写操作添加了锁
hashmap非线程安全。
2.hashtable不允许key为空值,当key为空时,会抛出空指针
hashmap允许一个为空的key,放在index为0的位置
3.迭代器不一样。
fail-fast迭代器:如果有其它线程对集合进行的添加/删除元素,将会立刻抛出ConcurrentModificationException.
HashMap的迭代器(Iterator)是fail-fast迭代器,Hashtable的迭代器(enumerator)不是fail-fast的。
4.hashtable初始容量11,扩容因子0.75
HashSet
作为Set集合的一种,首先是无序的,不可重复的;
允许存放null值;
底层封装HashMap;
实现是不同步的,线程不安全;
hashset底层封装了hashmap,将值c存放在hashmap的key中,hashset的add方法底层调用了hashmap的put,而判断key是否相同,是通过hashcode和equals方法,所以如果hashset中想要存放object并且不重复的话,需要重写hashcode和equals方法。
原文链接:HashMap和HashTable和HashSet的理解
put(key,value): 注意key不能为空,但是value可以为空
key如果为空,会抛出空指针异常
线程.start
/**
* User:yang
*/
class MyThread extends Thread{
@Override
public void run() {
//线程要执行的代码
while (true){
System.out.println("这是新线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello world");
MyThread myThread=new MyThread();
myThread.start();
while(true){
System.out.println("这是主线程");
Thread.sleep(1000);
}
}
}
import java.util.TreeMap;
/**
* User:yang
*/
class MyTask implements Runnable{
@Override
public void run() {
while (true){
System.out.println("hello");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
Runnable myTask=new MyTask();
Thread t=new Thread(myTask);
t.start();
}
}
Thread t2=new Thread(){
@Override
public void run() {
long b=0;
for (long i = 0; i <count ; i++) {
b++;
}
}
};
public static void main(String[] args) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
});
t.start();
}
public static void main(String[] args) {
Thread t=new Thread(()->{
System.out.println("hello");
});
t.start();
}
参考这个测试开发
Selenium(自动化测试),禅道(管理),loadrunner(性能),fidder(抓包), postman(接口测试)
功能成熟(产品稳定,功能稳定)
周期长
可测性强(人工干预的多不多)
参考自动化测试
让开发人员发邮件,说明情况,邮件抄送开发领导,测试领导,产品经理
等待领导层处理
因为对于你和开发你们并不能非常绝对的判断bug严不严重,所以一定要和领导去沟通。
import HTMLTestRunner
import os
import sys
import time
import unittest
def createsuite():
discovers = unittest.defaultTestLoader.discover("../src0811", pattern="testbaidu*.py", top_level_dir=None)
print(discovers)
return discovers
if __name__ == "__main__":
# 1,创建一个文件夹
# 当前的路径
curpath = sys.path[0]
# sys.path 是一个路径集合数组
print(sys.path)
print(sys.path[0])
# 当前路径下resultreport文件夹不存在的时候,就创建一个
if not os.path.exists(curpath + '/resultreport'):
os.makedirs(curpath + '/resultreport')
# 2,解决重复命名的问题
now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
print(time.time())
print(time.localtime(time.time()))
# 文件名是路径加上文件的名称
# 准备HTML报告输出的文件
filename = curpath + '/resultreport/' + now + 'resultreport.html'
# 打开 HTML 文件, wb 以写的方式
with open(filename, 'wb') as fp:
# 括号里的参数是 HTML 报告里面的参数
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
description=u"用例执行情况", verbosity=2)
suite = createsuite()
runner.run(suite)
参考:从输入URL到浏览器显示页面发生了什么
什么是token
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。 ‘
’参考token
交换排序(冒泡排序,快速排序)
1、在软件开发中,可以采用以下措施保证软件的质量;
2、审查。在生命周期每个阶段结束之前,都要使用标准对该阶段生产的软件配置进行严格的技术审查;
3、复查和管理复审。复查是检查已有的材料,以断定某阶段的工作是否能够开始或继续;管理复审是向开发组织或使用部门的管理人员,提供有关项目的总体状况、成本和进度等方面的情况,以便他们从管理角度对开发工作进行审查。
4、测试。通过测试计划、测试过程与测试结果对软件质量进行保证;
5、软件质量保证活动。以上各项活动内容都须写入质量保证计划,并由质量保证小组监督实施。由此可见,质量保证既是技术活动,也是管理活动;
6、软件评审。评审是以提高软件质量为目的的技术活动。要通过对软件的规格说明、可靠性、性能实现、可修改性、可扩充性、可移植性、可测试性、可复用性以及评审的实施等方面对软件项目做好严格的评审,以确保软件质量;
7、采用质量保证标准。质量标准用于实现质量管理的组织结构、责任、规程、过程和资源。采用ISO质量保证模型。可以用于质量计划、质量控制、质量保证和质量改经所需的组织结构、规程、过程和资源;
8、结构化的软件测试。经过严格的软件测试,尽可能找出软件计划、总体设计、详细设计、软件编码的错误,并加以纠正,才能提高软件的质量。测试要覆盖整个软件的生存周期,而不限于程序的编码阶段。
9、软件维护。采用结构化维护,完整的软件配置为基础,通过完善性维护、纠错性维护、适应性维护及预防性维护提高软件质量。
来源:软件质量
https://blog.csdn.net/weixin_45417628/article/details/119960058
测试人员常用的测试用例——QQ、微信发消息功能通用哦!一起来展现你的智慧吧
/**
* 判断一个数是不是质数
*/
public static boolean isPrime(int number){
if(number<2){//若此数小于2,则不是质数
return false;
}
//从1-number本身循环取余计算
for(int i=1;i<number;i++){
if(number % i == 0){//余数为0,能整除
if(number == i){//是否是本身
return true;
}else if(i!=1){//是否是1
return false;
}
}
}
return true;
}
参考:HTTP权威指南 – HTTP协议有哪些请求方法(Method)?
get,post区别
get===>url,请求长度:1024kb,可以被缓存/收藏/保留浏览记录,常用于请求查询数据,
post===>body,post不限,不可以缓存/收藏body/保留浏览记录,常用于提交数据,
相对而言,post更安全,不会在url被劫持,
querystring 是url的一部分
get、post都可以带上。
get的querystring(仅支持urlencode编码)
post的参数是放在body(支持多种编码)
cookie、session和token
MySQL】MySQL有几种锁
错误推测法