【实际开发16】- 测试

目录

1. 测试 基础认知

1. 开发人员和测试人员的比例

2. 测试

1. 软件测试分类

1. 按测试用例的设计方法 : 白盒测试 / 黑盒测试

2. 按测试策略和过 : 单元测试 / 集成测试 / 确认测试 / 系统测试

2. 高质量的程序取决于 : 高质量的设计 / 规范的编码 / 有效的测试

1. 发部的测试效果不好 , 为什么

2. 把单元测试的任务堆积到系统测试阶段的后果

3. 软件缺陷的修复费用 ~ pic

3. API 测试员 - 白盒测试 ( 只关注 API )

1. 百盒测试

2. 黑盒测试

3. 幂等性测试

4. tester's - code testing

1. 线上测试环境 与 线上开发环境 的冲突

2. 测试用例

3. 测试 Bug 清单提交 / 跟踪 / 闭环反馈

5. developer's - code testing

1. Scanner - 控制台输入类

1. Scanner introduction ×4

2. Scanner 基础 解析

2. @Test / void main方法 ( JUnit / void main )二选一

1. 拓展 : 其他基础代码说明

2. @Test 使用注意事项 ( 情景 )

3. main 方式使用注意事项 ( 情景 )


1. 测试 基础认知


1. 开发人员和测试人员的比例

再谈开发人员和测试人员的比例_KerryZhu的博客-CSDN博客_一个项目有多少测试人员 开发人员和测试人员的比例

 人们经常还是喜欢纠缠在一些具体的数字上 , 特别是西方人更是喜欢用数据说明问题 , 
 因为那样客观、具体 , 
 但同时也往往将人引入歧途 , 容易形而上学 , 
 因为每个公司、公司的每个产品、产品的各个项目或各个阶段都不同 , 没法用一刀切的办法。
 在软件企业 , 面对测试经理 , 常常被问的问题是“你们公司的开发人员和测试人员的比例多少?” , 
 如果你回答是“2:1” , 得到的反应也许不同 , 
 对方可能会说:你们公司挺重视质量的 , 测试搞得不错啊!
 也可能会说:你们公司测试人员太多了 , 开发人员不怎么样吧?

有个学者做个这方面的调查 —— Tester to Developer Ratio Initial Research Findings , 因为这个想法也缠绕着他整整十年。

他通过4个问题调查得到一些数据 , 可以供那些对此感兴趣的人参考。

4个问题是:

  1. 你的组织有多少开发人员 ?

  2. 你的组织有多少测试人员 ?

  3. 如果以1到 6这个范围来看 , 其中1代表低 , 6代表高 , 你给当前这个比率的有效性打多少分 ?

  4. 关于当前这个比率的有效性有其它一些奇闻轶事吗 ?

调查结果显示:

 测试人员最贫乏的:20个开发人员对1个测试人员 (有效率比较低 , 是2)
 测试人员最丰富的:15个开发人员对8个测试人员 (有效率比较高 , 是4)
 也有一个异常数据:4个开发人员对0个测试人员(有效率是3)
 ​
 平均比率是 4.52个开发人员对1个测试人员
 最常见的情况是:3个开发人员对1个测试人员
 其次是:2.5 个开发人员对1个测试人员 
 ​
 多数是开发人员与测试人员比率是3:1 或更低(即 2.5:1 或 2:1 ) 

有效性也是很重要的考量因素 , 因为虽然 开发人员和测试人员的比例是一种客观存在 ,

比例过高或过低也许是可行的 , 但是否带来高质量的产品是重要的考量因素 ,

或者说 , 是否严重影响企业的业务。

所以 , 成功企业的开发人员和测试人员的比例常常更有说服力 , 这就是人们常常以微软、Google 作为范例 , 见 测试人员与开发人员的比例究竟多少是合理的?中讨论。

从另个角度说 , 质量是构建的 , 从需求、设计到编码 , 只有每个环节做好了 , 质量才能上去。

而且这些环节做好了 , 特别是开发人员进行了足够的单元测试 , 测试人员可以大大减少。

如果更彻底一些 , 开发人员有足够强的责任心和良好的素质、能力 , 从项目开始就全面对质量负责任 , 开发人员不但杰出完成设计和代码 , 而且自己全面完成相关的单元测试、功能测试、性能测试、安全性测试 , 那么就不需要测试人员。

也就是说 , 软件测试完全可以让有高度责任心的开发人员完成 , 虽然这样的开发人员在国内并不多见(在国外也不多见)。

提高开发人员:测试人员的比例 , 也有积极的一面 , 它会驱动产品设计人员、开发人员具有更强的质量主人翁精神 , 承担更多的责任 , 做好需求分析、设计 , 写好代码和充分地完成单元测试 , 提高各个阶段性成果输出的质量。

要达到这样的目标 , 需要从管理层开始 , 具有相同的认识——如质量是构建的、软件产品的质量更大程度上取决于产品设计人员和开发人员 , 以整个团队改进质量和提高效率为宗旨 , 不断驱动产品设计人员和开发人员做好工作 , 领导持续改进的过程 , 最终整个团队是受益的。

从这个角度看 , “开发人员:测试人员的比例”问题不是向测试经理提出的挑战 , 而是向整个团队的挑战 , 更多地是向开发人员的挑战 , 即应该经常问开发人员:

设计的重构经常做吗?

为什么写出这么多的缺陷?

根据缺陷分析的结果改进了代码规范?

下一个版本每千行代码缺陷数可以降低30%~50%?

单元测试覆盖率超过80%?......

再换个思路 , 如果像那样开发人员做测试人员的工作 , 合算吗?

测试人员是少了 , 开发人员多了 , 整体开发的成本并没有降低 , 反而是成本提高了 , 又何苦去追求哪个3:1或4:1的数据呢?

测试人员更多站在客户角度思考问题 , 对开发人员的互补作用也不可忽视。

软件开发最根本的就是质量和生产力。如果生产力不好衡量 , 就设法降低成本。一切有助于提高产品质量和生产效率的、实实在在的事 , 倒是我们要去做的。有时 , 数字倒不重要。


2. 测试

软件测试分类

  • 按测试用例的设计方法,软件测试分为白盒测试和黑盒测试。

  • 按测试策略和过程,软件测试分为单元测试、集成测试、确认测试和系统测试。

  • 按软件系统工程,测试是软件质量保证的最后的一关。


1. 软件测试分类


1. 按测试用例的设计方法 : 白盒测试 / 黑盒测试


2. 按测试策略和过 : 单元测试 / 集成测试 / 确认测试 / 系统测试


2. 高质量的程序取决于 : 高质量的设计 / 规范的编码 / 有效的测试

  1. 高质量的设计

  2. 规范的编码

  3. 有效的测试


1. 发部的测试效果不好 , 为什么

开发部的测试 效果不好:为什么 ?

没有时间测试

不知道怎样测试

不好组织

缺乏方法和工具

这种情况下,往往把单元测试的任务堆积到系统测试阶段。


2. 把单元测试的任务堆积到系统测试阶段的后果

如果把单元测试的任务堆积到系统测试阶段,将会怎样 ?

大量的故障堆积在项目中后期:项目后10%的工作,占用了项目90%的时间。

故障难以定位

故障飘忽不定

开发、测试人员疲于奔命


3. 软件缺陷的修复费用 ~ pic


3. API 测试员 - 白盒测试 ( 只关注 API )


1. 百盒测试


2. 黑盒测试


3. 幂等性测试

幂等性 : 同一接口调用多次 ( 使用相同的参数 ) , 对系统的影响是相同的。

怎样才是对系统有影响 ?

有影响--->增删改操作 , 修改一个用户信息 , 删除用户与某人的关联关系 , 生成一个用户订单等;

无影响--->统计在线用户的接口 , 对系统没有影响 , 所以不需要满足幂等性;


4. tester's - code testing


1. 线上测试环境 与 线上开发环境 的冲突


2. 测试用例


3. 测试 Bug 清单提交 / 跟踪 / 闭环反馈


5. developer's - code testing


1. Scanner - 控制台输入类


1. Scanner introduction ×4

稍微对Scanner类做一个简单清晰的说明 , 适合初学者 , 大概Scanner类知道这些就够了

一、简介

Scanner类是java.util包中的一个类

二、作用

常用于控制台的输入 , 当需要使用控制台输入时即可调用这个类

三、使用方法

   // 1、首先需要构造一个Scanner类的对象 , 并且与标准输入流System.in关联
 ​
   Scanner sc=new Scanner(System.in); 
 ​
   int i=sc.nextInt();
 ​
   // 2、调用Scanner类对象sc的方法从输入流中获取你需要的输入

说明:

当创建了一个Scanner类对象之后 , 控制台会一直等待输入 , 直到敲回车键结束 , 把所输入的内容传给对象sc , 若要获取需要的内容 , 调用sc的方法即可

四、常用方法

①nextInt()只读取数值 , 读取完后\n没有读取并且光标放在本行

         Scanner sc=new Scanner(System.in);
         int i=sc.nextInt();

②next()方法遇到第一个扫描有效字符 , 即第一个非空格非换行符后面开始 , 一直获取到下一个空格 , 换行符之前的 , 单个字符串

         Scanner sc=new Scanner(System.in);
         int i=sc.next();

③nextLine()可以扫描到一行内容并作为一个字符串而被获取到

         Scanner sc=new Scanner(System.in);
         int=sc.nextLine();

我们有必要积极的关闭不再需要的流嘛 ?

如何对待 io.close? 如何预防该问题 ?

 从性能的角度来说 , 积极关闭流是必须的 , 实际上如果我们使用findbugs等代码规范工具 , 能发现关闭io是被强烈推荐的。
 ​
 如果你使用idea的话 , 建议在close之前 , 使用快捷键 ctrl+b进入close方法的源代码 来查看其关闭机制。
 这种方法非常简便 , 当然eclipse应该也有插件可以实现类似功能。
 ​
 我们也可以通过包装System.in/out/err来安全的使用它们 , 
 实际上利用装饰器模式 , 覆盖System.in/out/err的close方法即可。 


2. Scanner 基础 解析

Java Scanner用法详解_魏晓蕾的博客-CSDN博客_javascanner用法

Scanner:
Scanner scanner(变量名·可改)=new Scanner(System.in);
Scanner input = new Scanner(System.in); 
System.out.println("输入敌人的血量:");
input.next()	;无法输入空格
input.nextline();	可以!
username.equals("zhangsan") (判断username字符串 , 是否="zhangsan"字符串)

int i=sc.nextInt();  ①nextInt()只读取数值 , 读取完后\n没有读取并且光标放在本行
int i=sc.next();      ②next()方法遇到第一个扫描有效字符 , 即第一个非空格非换行符后面开始 , 一直获取到下一个空格 , 换行符之前的 , 单个字符串
int=sc.nextLine(); ③nextLine()可以扫描到一行内容并作为一个字符串而被获取到

system.in  标准输入流 可以包装成字节流或者字符流均可 比如字符流 你输入字符
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
str = br.readLine();

Scanner scanner(变量名·可改)=new Scanner(System.in);

Scanner input = new Scanner(System.in); 

System.out.println("输入敌人的血量:");

input.next();          //无法输入空格

input.nextline();    //可以!

int i=sc.nextInt();   // 1、nextInt()只读取数值 , 读取完后\n没有读取并且光标放在本行

int i=sc.next();      // 2、next()方法遇到第一个扫描有效字符 , 即第一个非空格非换行符后面开始 , 一直获取到下一个空格 , 换行符之前的 , 单个字符串

int=sc.nextLine();       // 3、nextLine()可以扫描到一行内容并作为一个字符串而被获取到

system.in 标准输入流

可以包装成字节流或者字符流均可 比如字符流 你输入字符

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
str = br.readLine();

import java.util.*;  (*代指导入所有类)---但浪费资源!!!
import java.util.Scanner; (导入一个Scanner类)---------------该语句快速导入方法:

JUnit 4 添加流程:    项目 - Build Path - add Libraries - JUnit  (完成添加流程!)
    1、junit , 测试方法必须公开public;
    2、测试方法的前缀必须有一个test , testXXX;
    3、只有测试方法才加   " @Test " 注解

mySQL数据库 , 新建设置:    字符集:utf8 -- UTF-8 Unicode ;排序规则utf8_general_ci     


2. @Test / void main方法 ( JUnit / void main )二选一

    import org.junit.Test;

    @Test

单元测试 , 比 void main 用的多;

单元测试不能有返回值、参数;

  //代表一个主方法 , 程序入口
    public static void main(String[] args){
        System.out.println("输出文字); 		//在命令行输出一行文字 , 
    };	

public 关键字 代表;公开(代表方法是公开的 , 可以被其它类调用)

class 关键字 代表;定义类

void main 程序执行入口

void 代表无返回值(不需要返回值时;可以定义为空;return void)

args    arguments;的缩写    英 /'ɑːgjʊm(ə)nts/    n. 参数

参数可以是单数 , 比如 arg

可以是多数 , 即数组 , 比如 args


1. 拓展 : 其他基础代码说明

static 代表静态 , 方法可以直接被main方法调用

静态只能用静态方法调用------static;


String[] 代表一维数组。例如:String[] str=new String[4] , 这个创建一个有4个元素的数组。

String[][]是二维数组。例如:String str=new String4 , 这是创建了一个有4行4列元素的数组。

String[] 代表格式为String数组 ; 如 str[1] str[2] 等。String [][]代表多维数组了.[][] , 可以理解为几行几列。

String 是编程语言中的字符串 , String 类是不可变的 , 对 String 类的任何改变 , 都是返回一个新的 String 类对象。

args:参数

int[] 是指定义一个整型的一维数组 , 其中的int是整型字符 , 【】则是要在其中放入一维数组的数位 , 它表示该数组中有几个元素。

比如定义 int[3]={1 , 2 , 3}; 这个式子就表示定义了一个整形的一维数组 , 花括号内的 1 , 2 , 3 是数组中的三个元素。


public static void

返回值为负数 , 可判断没有找到;

文档注释:有特殊效果

条件省略:死循环

更新省略:死循环

int 小整数/大整数 , 结果一定等于0;

continue 先执行外层循环 , 再执行内循环;

装箱和拆箱都是编译器自动完成。


2. @Test 使用注意事项 ( 情景 )

必须 返回 void


1. @Test 与 System.out.println(“xx”) 使用异常 : 需改 IDEA 配置


3. main 方式使用注意事项 ( 情景 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值