精华内容
下载资源
问答
  • 以什么样格式传个服务端,接口的响应数据里需要验证哪个字段值即可进行测试,而不需要知道怎么建一个工程,怎么建一个测试类,测试方法,testng是怎么使用,结果怎么解析,怎么取到想要字段去判断。...

    软件测试,爱码小哥邀你同行!

    1. 背景

    先来说说花椒测试平台的由来:

    #目的1,降低接口测试对测试人员代码能力的要求。测试人员只需要知道接口的url,请求参数,以什么样的格式传个服务端,接口的响应数据里需要验证哪个字段的值即可进行测试,而不需要知道怎么建一个工程,怎么建一个测试类,测试方法,testng是怎么使用的,结果怎么解析,怎么取到想要的字段去做判断。

    #目的2,可视化的case管理,执行,结果管理。打开一个浏览器,根据接口文档新建一个测试case,执行检查接口返回,保存case,建不同入参的该接口的case,组成case集,批量运行,查看运行结果,相比于工程执行批量case,testng的html结果,平台的集中展示更清晰。

    #既然接口的测试已经有case的信息了,对接口进行压测的请求其实也类似一个case,只不过是有很多人在同时执行这个case,所以有了压力测试和接口测试平台的整合。在平台建压测任务的时候选定一个测试用例为载体,多并发的执行case,统计压测数据,实时展示。以往接口测试和压力测试都是分别写一个方法,里面有很多重复的部分。

    #接下来我们会想,像接口测试是由数据驱动的,那么UI自动化是否可以理解为一种另类的驱动呢?UI操作的公共方法如点击,输入,检查元素的值,其实和接口入参和结果检查很像,基于cucumber我们将UI自动化集成进了测试平台,测试人员只需要关心我点击的是哪个页面的那个button或输入的内容,期望那个元素是什么展示即可,降低了测试人员的代码门槛,app页面发生变化时,case维护成本较原来的通篇代码修改有所降低。

    2. 花椒测试平台整个框架
    说了这么多,先来看看花椒测试平台的整个框架:

    在这里插入图片描述
    该框架主要由三大部分组成,今天主要介绍接口部分的一体化(接口测试+压力测试):

    Web平台
    Web平台是花椒测试平台的核心部分,主要是给测试开发人员提供可视化的界面操作,并封装为参数信息,调用后端的接口服务处理,展示处理结果给用户。后端采用Springboot + Mybatis框架,前端页面用jsp开发,后续UI自动化和部分工具的前端页面也有用vue框架开发,权限管理用的shiro,做好详细的权限管理,因为如果操作线上case,很有可能会对线上真实用户造成影响,所以线上case的权限只对部分人员开放,另外比如压测的功能,也需要做好权限管理,同时后端会记录每个用户的操作行为,便于追查。测试平台模块主要包含以下几个:

    Case管理

    Case管理部分,主要是管理包括接口case,场景case,bvtcase等的增加,修改,和在线执行

    接口Case
    case增加,删除,更新,另存为新用例,查找

    case结构信息如下:

    cases` (
    运行环境:测试环境,预发布,线上
    模块:根据业务划分的模块
    优先级:重要级别
    Guid:特殊校验方式
    参数格式:content-type和业务的结合,特殊的业务有特殊定义
    用例名称,用例说明
    url:接口url
    Token,请求头信息:请求头信息里的,Token标识用户
    用例变量:抽取出来的变量,方便更改
    请求参数:json结构体key-value的方式存储请求信息,后端请求的时候按参数个数组装
    期望返回验证:对结果的校验,目前有等于,包含,自定义方法上线文验证等
    )
    

    以用户更新测试用例为例来看一下整个交互流程:

    用户浏览器一个case,网页请求后端服务器,Shiro判断登陆状态跳转页面到第三方登陆,输入用户名密码后调第三方登陆服务,用户错误返回登陆失败,用户正确向数据库查询用户角色和权限,返回展示case页面及有权限的menu,用户修改case信息,编辑后点击保存,网页向服务器请求接口,服务器判断用户是否有访问权限,有权限则保存case更新到数据库,返回页面展示保存成功,没有权限则返回页面展示“保存失败,没有权限操作”

    case测试执行

    前端获取页面的case信息,URL,请求method,加解方式,参数,期望验证,以form的形式请求后端js_case_execute接口执行测试用例,服务器内部解析请求内容,调用case处理中心模块CaseRunner组装请求,向测试服务器发起请求,根据预设的断言,判断case的运行接结果,并将结果和服务器的返回组装成json格式返回给页面展示,页面的json展示用了开源的JSONFormatter.js (https://webscripts.softpedia.com/script/Development-Scripts-js/HTML-Tools/JSONFormatter-js-76391.html),能够根据各个层级展开和叠起,方便测试人员查看数据返回。js_case_excute实行如下:

    @ResponseBody
        @RequestMapping(value = "/js_case_execute", method = RequestMethod.POST)
        public Response js_case_execute(Case hjcase, HttpServletRequest request) {
            RequestUtil.preResetField(request, hjcase);
            try {
                List<CaseResult> resultList = new ArrayList<CaseResult>();
                CaseResult hjresult = new CaseResult(hjcase.getId(), hjcase.getCasename(), -1, "");
                executeCase(hjcase, hjresult);
                resultList.add(hjresult);
                // 把该case加入我的常用case列表,方便使用
                RedisService.addToMyFavCase(SecurityUtils.getSubject().getSession().getAttribute(Const.SESSION_USER), hjcase.getId() + "_" + hjcase.getCasename());
                return new Response(resultList);
            } catch (ParamFormatException e) {
                //e.printStackTrace();
                return new Response(1, e.getMessage());
            } catch (Exception e) {
                e.printStackTrace();
                return new Response(1, "Exception---" + e.getMessage());
            }
        }
    

    case批量运行

    由于测试过程中经常会有制造批量数据,小并发运行的需求,并发支持对请求变量值设置数组运行,多线程随机或顺序取数组里的用户执行case,统计case耗时和平均响应时间,页面设置如下:

    批量实现:

    @ResponseBody
      @RequestMapping(value = "case/batchExecCase")
      public Response batchExecCase(Case hjcasesrc, HttpServletRequest request) {
          RequestUtil.preResetField(request, hjcasesrc);
          if (hjcasesrc.getCasetype() == 2) {
              // suite case 只支持以数据库的为准
              try {
                  List<Case> subCases = caseService.findByIds(hjcasesrc.getCaseids());
                  hjcasesrc.setSubCases(subCases);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          // 把需要批量运行是替换的参数解析,需多线程访问
          Response response = new Response(); // response 传递为了返回运行时数据, 所有线程都共享该response,且可以修改其值, 不使用静态对象是因为多个并发请求会相互影响
          try {
              List<BatchKeyInfo> keyinfos = hjcasesrc.getBatchKeyInfos();
              httpUtils utils = new httpUtils();
              // 提前取用户登陆信息,获取出来, 都放入sampleList中,并且设置sampleType=2
              for (BatchKeyInfo keyinfo : keyinfos) {
                  if (!keyinfo.isToken()) {
                      continue;
                  }
                  ...//省略获取用户信息
                  break;
              }
              response.put(Response.TOTAL, totalBatch);
              List<Thread> threadPool = new ArrayList<Thread>();
              for (int i = 0; i < threadnum; i++) {
                  httpUtils httputils = new httpUtils();
                  CaseRunner runner = new CaseRunner(hjcasesrc, keyinfos, httputils, response);
                  runner.setRunTime(totalBatch);
                  Thread runnerThread = new Thread(runner);
                  threadPool.add(runnerThread);
              }      
              long starttime = System.currentTimeMillis();
              for (Thread worktask : threadPool) {
                  worktask.start();
                  worktask.join();
              }
              long endtime = System.currentTimeMillis();
              float avgTPS = (float) totalBatch / ((endtime - starttime) / 1000.0f);
              response.put("Comsume", endtime - starttime);
              response.put("avgTPS", String.valueOf(avgTPS));
          } catch (Exception e) {
              e.printStackTrace();
          }
          return new Response(response.getResultJSON());
      }
    

    场景case
    场景case来源于用户的一系列有联系的操作行为,比如用户A想要和主播B连麦,A先发起连麦,B主播同意,A用户同意,然后用户A和主播B连麦成功,这里面就有3个接口,一个是发起的apply接口,同意的accept接口,和开始连接的connect接口,所以组成这个场景的子case有三个,case1用户A发起apply,成功后返回申请的id传递给case2/case3, case2主播accept连麦, 请求的用户信息是主播B, case3用户B开始connect连麦。

    执行的整个过程是,先抽取变量,执行case1,处理断言信息,赋值返回的申请id,然后执行case2,case2的传参申请id用case1返回的id同意申请,case3用case1的申请id开始连麦,整个过程的顺序必须是case1->case2->case3。场景 case存储时,抽离出每个case的用户信息,输入,期望判断信息,如“0”:values,组成一个大的jsonobject,case运行时,解析结构体,顺序执行,case的主数据库结果体信息如下:

    BVTCase集
    BVTCase为各模块接口case集管理中心,case集可以共享请求服务器地址,用户等信息,case集内可以定义case的执行优先级,执行整个case集,查看执行结果,对外给发布系统提供查询,执行测试集的接口并返回结果给发布系统判断是否允许发布。另外也增加了crontab任务定期执行。

    新建测试Suite,编辑测试Suite,编辑测试case顺序,执行测试Suite,批量执行测试Suite

    对外代码发布系统获取测试Suite列表,指定测试Suite信息,调用测试Suite执行
    inter/getSuiteLists获取测试集列表,可指定模块,如passport,live等

    inter/getSuiteInfo获取指定id的suite信息,全部变量及各子case信息

    inter/execSuiteList执行测试集,并返回测试集执行结果,成功失败,测试集的详细结果的访问方式

    结果集,为测试suite执行的结果列表页面,记录执行结果,耗时已经执行人的信息:
    结果集名称,总条数,成功条数,失败条数,状态(成功,失败),执行人

    工具管理

    平台工具管理中心,主要包含两种类型的工具,一种是jar包等上传可执行文件的工具,一种是在线使用工具:

    可执行文件工具
    平台支持添加脚本,上传jar包,指定传入的参数等,保存脚本信息,支持编辑更新,测试执行

    在线使用的工具

    该类工具如网页版的redis查询工具,byte string转换,数据清理等各种小工具,可以根据业务测试中的各种需求开发各种能提升效率的小工具,如下面这个byte string转换小工具,功能很简单,但解决了手工测试无法看到内容的困扰,提升了定位问题的效率

    压力测试管理
    压测场景
    支持新建,更新压测场景,压测场景绑定已经建好的接口测试用例,修改用例变量值如用户id来实现多用户压测场景,压测场景包含的信息如下:

    压测场景{
    模块:选择压测场景属于的业务模块
    用例id:选择压测的case
    压测场景:压测的场景的名字
    场景说明:该压测的信息说明,如多少个用户,多少并发
    压测服务部署机器:部署压测服务的机器IP
    启动线程个数:并发线程个数
    运行次数:执行多少次case
    发送间隔:每个线程每个请求处理完后的休息间隔(可为0)
    用例变量:从选择的用例id里带过来的用例变量,便于压测过程中修改方便
    压测参数:对用例变量进行取集合值,或从指定数值开始的多少个数,常用于多用户的场景压测
    }
    

    压测执行
    点击启动压测任务

    压测结果
    点击结束任务时,当次压测的数据汇总回写到结果数据表,统计请求TPS(reqTPS),响应时间(respTime),响应TPS(respTPS)的最大最小值和平均值,以及总请求个数,以及失败的请求个数。

    压测服务
    压测服务是执行压力测试的中心服务,可以部署在任意可执行压测任务的服务器(有java环境即可),主要逻辑是监听从web,或者PC压测Client传过来的压测指令,根据执行获取压测信息,起线程进行压力测试,每秒统计一次压测数据,并将数据同步到数据库,供web平台展示查看实时压测结果并进行压测调整。

    主要包含以下几个主要模块:

    监听服务
    监听服务是指启动一个socket server来监听指定端口,收到指令,为了保证安全性,先判断指令发送IP是否在白名单内,如不在,拒绝服务;解析命令内容,命令内容以TasK*开头,则代表从测试平台来的命令,执行相应操作,如启动任务,执行压测任务(CaseRunner分支),更新任务信息,结果任务等;如果命令内容直接以Start,任务名称等开头,则走自定义压测执行压测任务(WorkTask分支),自定义部分适合复杂场景和统计需求的压测。

    ...//以收到启动命令为例
    if(cmd.equals("TaskStart")){ // 启动线程,初始化变量                                  
        int content = Integer.parseInt(params[1]);                                             // 非结束状态,说明 可能有些初始化或销毁操作是需要进行的, 必须&& 非下面两种状态时处理            
        if(CommonTaskData.getSTATE() == CommonTaskData.RUNNING || CommonTaskData.getSTATE() == CommonTaskData.PAUSE)   // 从 start 之后 还是start--                       
        {
            if(CommonTaskData.getId() == content) {
                // 如果还是同一个task, 则只需重新更新一下task即可 
                CaseHelper casehelper = CaseHelper.getInstance();                                         StressTaskHistory taskhistory = casehelper.getTaskHistory(content);                       CommonTaskData.setTask(taskhistory.parseStressTask());                                   System.out.println("从暂停状态中恢复~~");                                                   for(CaseRunner runner : caseRunners){                                                              runner.setState(CommonTaskData.RUNNING);                          
                }
                CommonTaskData.setSTATE(CommonTaskData.RUNNING);                                                                   continue;                             
            } else{
                System.out.println("不同TaskId Start ----先清理之前线程");                                   for(CaseRunner runner : caseRunners){
                    runner.setState(CommonTaskData.STOP);                                
                }
                for(Thread worktask : threadPool){// 等待3s的销毁时间 销毁原来的线程池
                    try {
                        worktask.join();                                   
                    } catch (InterruptedException e) {
                        e.printStackTrace();                                   
                    }                                                                
                }                                                              
            }                       
        }
        Statistics.startSampling(); //启动压测统计服务
     
        ...//准备压测执行的数据,读取case和task信息
     
        //设置运行状态,启动线程
        CommonTaskData.setSTATE(CommonTaskData.RUNNING);                        
        for(int i =0; i < CommonTaskData.getThreadnum(); i++){    
            CaseRunner runner = new CaseRunner();                          
            runner.setState(CommonTaskData.RUNNING);                          
            Thread worktask = new Thread(runner);                          
            threadPool.add(worktask);                          
            caseRunners.add(runner);                          
            worktask.start();                        }                                             }
        ...
    

    压测任务处理
    根据测试平台或PC client发过来压测任务,CaseRunner执行相应的case,并将请求的结果,如成功与否,请求的响应时间等发送给Statistic统计服务进行打点统计,目前CaseRunner执行方式的压测适用与web的http同步请求,而自定义压测方式的worktask则既可以定义同步的等待响应后发送下一个请求的方式;也可定义直接往服务器扔请求,异步接收线程处理响应结果及给Statistic统计服务发送打点数据。下面一CaseRunner同步执行的方式为例:

    @Override
    public void run() {        
    while(true)
    {           
        ...停止,暂停等状态,中断执行
     
         casedata.copyFrom(CommonTaskData.getBasecase());
         casedata.appendGlobalVar(varMap);
         CaseResult  caseresult = new CaseResult();
     
         String actionName = "Task" + CommonTaskData.getTask().getId();
         try {
             Statistics.OnRequestSend(actionName);
             long pre = System.currentTimeMillis();
             utils.runCase(casedata, caseresult);
             long after = System.currentTimeMillis();
             //根据case执行成功失败,打点
             if (caseresult.getStatus() == 1) {
                 Statistics.OnResponseRecv(actionName);
                 Statistics.onResponseTimeRecv(actionName, after - pre);
             }
             else{                    
                 Statistics.onFailedResp(actionName);
                 try{
                     if(casedata.getCasetype() == 1){
                         ...//根据case里设置的断言,统计特殊需求的失败,总个数和失败请求的响应时间
                     }
                 }
                 catch(Exception e)
                 {   
                    System.out.println("CaseRunner(114) - Exception-" + e.getMessage());
                 }
                 Logger.SysOutput("Fail:" + caseresult.getResult().toString());
             }
     
         } catch (Exception e) {
             e.printStackTrace();
             Logger.SysOutput("CaseRunner(123) - Exception:" + e.getMessage());
         }
     
         // 测试场景如果设置的发送间隔,则sleep
         if(CommonTaskData.getSleeptime() > 0){
                if(CommonTaskData.getSleepRan() == 1){
                     Tools.sleep(RamNum.GetRamInt(CommonTaskData.getSleeptime()));           
                }else{
                     Tools.sleep(CommonTaskData.getSleeptime());
                }               
         }
    }
    }
    

    Statistic压测结果统计
    统计每秒的请求数,响应数,响应时间,失败数等,如果是平台的压测请求,将压测数据根据需求记入数据库,供web平台展示用,具体实现如下

    @Override
    public void run() {
        long lastSampleTime;
     
        while(!stopSample){
        lastSampleTime = System.currentTimeMillis();
     
        try{
            Thread.sleep(samplePeriod);
            Object[] actionNameSet = actions.keySet().toArray();
            for(Object key : actionNameSet){
                Action action = actions.get(key.toString());
     
                if (!key.toString().startsWith("Task")) {
                    action.Sample(lastSampleTime);//统计请求信息,并打印
                    action.SampleResponseTime(lastSampleTime);//统计响应时间信息,并打印
                } else {
                    action.SampleRedis(lastSampleTime);//统计请求信息,响应,打印并存库
                }
            }
        }catch(InterruptedException e){
            System.out.println("Sample thread stop for interrupted exception.");
            break;
        }
    }
    }
    

    后续计划
    目前测试平台只集成了自动化测试的基本功能,在持续集成上的应用还需要丰富起来,另外作为一个质量管理平台,对提测->测试 -> 测试bug记录->测试结果->上线的整个过程并没有完整的整合起来,也是我们后续需要完善的地方。

    如果对python自动化测试、web自动化、接口自动化、移动端自动化、大型互联网架构技术、面试经验交流等等感兴趣的老铁们,可以关注我。欢迎分享,评论,转发。需要资料的同学可以关注我的主页获取资料链接。

    展开全文
  • 什么是接口测试

    2019-12-03 23:14:43
    在入场的软件开发过程中,前端开发,后端开发,移动端开发,他们开发的东西是怎么进行连接起来的呢?他们之间为什么是独立完成的呢?这也就是为什么要进行接口测试。 接口测试的由来: 连接前后端及移动端 因为不同...

    为什么要做接口测试?

    在入场的软件开发过程中,前端开发,后端开发,移动端开发,他们开发的东西是怎么进行连接起来的呢?他们之间为什么是独立完成的呢?这也就是为什么要进行接口测试。

    接口测试的由来: 连接前后端及移动端

    因为不同端的工作进度不一样,所以需要对最开始出来的接口进行接口测试,而且有时候我们需要调用其他公司的一些接口,比如说银行,淘宝,支付宝的等等,那么我们就需要进行接口测试以及验证数据。

    (1)节约时间,缩短项目时间
    (2)提高工作效率
    (3)提高系统的健壮性

    这么多优势,反过来问,我们为什么 不做呢?

    那么什么是接口测试呢?

    像是上边说的调用银行啊,支付宝等接口,都是通过HTTP请求,那么调用接口,可以理解为调用这些请求

    什么是接口

    接口的种类

    外部接口

    内部接口

    上层服务与下层服务
    同级服务

    接口的类型

    http

    post get delete put
    这里有一个常用面试题,就是get与post的区别,我们可以思考一下
    post请求的数据是放在WebForm里面的,以表单形式提交,get请求在url中提交,那么我们思考一下,get和post提交的数据到底哪个大哪个小呢?
    get的提交数据大小是由浏览器url的长度限制的,而post是以表单的方式提交,实际上get提交的数据要小一些,虽然HTTP协议规范没有对url的长度进行限制,但是特定的浏览器及服务器对url的长度是由限制的,而post传输数据量最大理论上没有限制,取决于服务器限制。

    经过实际测试

    在IE8 下的URL地址总长度为:4076,超过该长度会自动忽略后面的内容;

    在firefox 25下的URL地址总长度可以达到:7530,超过该长度会访问错误;

    在chrome 29.0.1547.62 的最大总长度达到:7675,超过该长度会访问错误;

    还有get请求中你说你的用户信息全部放在url中,你会觉得安全吗? 所以肯定是post相对安全

    展开全文
  • 从事了多年软件测试工作,主要是功能测试,也接口测试和简单的自动化,性能测试。待过几家不同的公司,从事过各种行业,比如游戏,金融,电商,办公系统等。什么BS/CS架构,什么PC/移动端都测试过。写这个也...

    前言

    从事了多年软件测试工作,主要是做功能测试,也做过接口测试和简单的自动化,性能测试。待过几家不同的公司,从事过各种行业,比如游戏,金融,电商,办公系统等。什么BS/CS架构,什么PC/移动端都测试过。写这个也就是闲着无聊打发时间,这里基本上没有什么概念性的东西,都是手打的白话文,写的都是网上没有的,都是我自己工作这么多年的经验感悟。希望你们看过后会有些帮助,就算没有帮助也不关我事,我开心就好。哈哈哈哈

    什么是软件测试?

    概念?软件测试是在规定条件下,对软件是否正确满足设计要求或者用户需求而进行评估的一个过程,用以发现软件或程序中存在的缺陷或不足。

    怎么理解软件测试呢?

    上面那句概念说的真的很完美了,简直是无懈可击。
    反正我的理解是在有限的条件内,尽可能多的发现BUG,而不是发现全部BUG。当然,如果你能发现全部的BUG那你就是神一样的存在了。说到这里,有些人可能就会担心那如果上线后出问题了怎么办?这个心态放平就好了,只要不是给公司带来巨大损失的,比如金额,客户量等敏感问题,其他的小功能问题或者是小体验问题都是浮云。但这不代表你就可以不负责任。

    测试过程中的小感悟

    责任心

    其实做测试最主要的是要有责任心,要对自己测试的产品质量进行负责。这个就看你个人的自觉性了,可能你偷懒几次,耍几次小聪明漏测几个测试点当时没人发现,但随着时间推移大家都可以对比出来你这个人能力怎么样。不负责任的人往往有两个结果,近的话就是给自己挖坑,然后自己慢慢填,远的话就是你个人能力的口碑会在这个圈子里传开,真的这个测试圈甚至是软件行业的圈子真的很小的。或许你觉得你很能说很会甩锅,但是每个人都不傻的。

    在测试过程中,千万不要放过一点你觉得不合理的地方,或者是偶发性的问题,测试过程中发现了一个不能复现的问题,一定要多尝试几次,如果还是无法复现,一定要提BUG单,把问题以及可能复现的操作步骤描述清楚,标上偶发性。让研发协助一起查原因。如果你遇到了这类问题,自己没有复现出来,也没有和研发一起协助查问题,然后就直接算了,那么很可能在上线后,用户使用量堆积起来后,这个问题就有很大概率的暴露出来。

    测试文档

    测试计划,测试策略,测试用例,测试报告,测试总结。
    概念和模板百度一下都有就不再详细说了,就说下这些文档有啥用吧
    这些文档只适用于大公司和大项目,我说的大公司是腾讯,阿里等等这些一线企业。大项目就是整个项目周期在一年以上,或者半年以上的项目吧,这些文档才会有用处。其他的小公司,千人内的公司这些文档以及整个项目周期按天,按月算的话就没有什么卵用。
    这些文档对大公司的作用你们百度也就百度出来了,这里就不再多说了。这里就说下这些文档在小公司小项目的作用。
    其实也就是做到文档沉淀,沉淀后呢?方便后来人更快上手。对实际测试过程中有用的也就是测试用例,对个人提升有用的话就是测试总结。

    测试计划和测试策略?需求评审完之后基本上就定下来了,人力,时间,范围。很多公司都不会再单独花时间去写测试计划和测试策略,虽然不用或者很少用,但是你得会写。

    测试用例?时间充裕的话就先画思维导图,然后写冒烟case,详细case,用例的模板网上都有,按模板写就没啥错。最传统的标准就是要写的让一个小白拿到测试用例都可以直接执行的那种。这里也给大家介绍一个详细的测试用例模板,可以参考使用。
    这里说下用例里面主要的东西有哪些,最主要的就是项目,模块,功能,测试点,接下来是预置条件,操作步骤,预期结果,然后是用例等级,用例类型,用例编号,最后就是编写人,对应研发,对用产品,评审人。有人肯定会说,最重要的不是操作步骤和预期结果么?别着急,先看下我写的测试点规范是怎么写的
    测试点:验证手机号输入框输入为空提示手机号不能为空。
    看懂了吧?我写测试点的时候就是把操作步骤,预期结果都用一句话概括了。这样时间不够的话就可以省去后面的那些东西。
    很多公司都会压榨测试时间,有些给你写用例的时间都没有,直接给需求,直接让你测试,然后当天上线,上面的所有文档都是扯淡了。这是不争的事实,老板开公司是要考虑成本的,什么时间,人力,资源成本都要综合考虑。而不是死板的说用例一定要按模板写,那你要么累死或者是项目周期拉长。
    上面说的多了一个思维导图,这个接触的人可能不多,工具有xmind,这个是描述的比冒烟case细,比详细case粗的一个文档。也就是长这样
    在这里插入图片描述
    测试报告?概念和模板你们也可以去百度看,真的不想再从别的地方复制过来。里面的内容都看各自公司的需要来写,一个公司甚至一个项目一套标准的。作用还是文档沉淀,方便后来人知道情况,还有一个就是甩锅的作用,有些里面可能包含有测试结果的截图。如果线上出现问题可以翻出来证明当时是测试通过的。

    测试总结(项目总结)?总结就是总结整个项目中存在的不足,并在下个项目中进行改进,模板请百度。主要说一点就是对象可以是流程类的比如项目流程,测试流程,也可以是人,产品,研发,UI,测试等角色。
    总结嘛认真做的话有用,敷衍了事走流程的话就没一点卵用,现在的我还是比较偏向用心写的。当我刚入测试行业的时候真的很反感这些文档,项目上线完不就完事了嘛,干嘛还要麻烦的写这些破玩意儿,时间久了,原来总结真的是可以对自己有提升的。可以让自己发现过去项目中存在的问题,在下个项目中尽量去避免,哪怕一个总结让你改进了一个问题那真的是起到了很大作用的。再往大的说对整个项目团队有提升的也是很厉害的。

    综上所述,这些文档的编写要根据不同的公司,不同的项目,紧急程度来适当编写,可以添加也可以删除冗余的,总归是随机应变,不要太死板。

    测试技术

    在日常工作中,针对自己负责的项目主要包含以下几种测试内容。这里先做简单介绍,我也会抽时间逐个完成详细介绍。

    功能测试

    功能测试这个就不用再过多介绍,根据需求文档,完成文档中描述的功能验证,其中涉及到等价类划分法,边界值法等,用到的测试方法我会另开一篇做详细介绍。

    易用性测试

    兼容性测试

    接口测试

    性能测试

    安全测试

    自动化测试

    测试工具

    抓包工具

    FiddlerCharlesStream
    Fiddler,Charles都可以通过电脑连接手机端进行抓包。相关的教程可以点击对应的超链接进去查看
    Windows系统的可以用Fiddler进行抓包
    MAC的可以用Charles进行抓包
    移动端IOS系统的可以用Stream抓包工具

    接口测试工具

    Postman,Jmeter
    后续会另开文章做详细介绍

    性能测试工具

    Jmeter
    后续会另开文章做详细介绍

    接口自动化框架

    httprunner+python
    后续会另开文章做详细介绍

    Linux服务

    SQL数据库

    Python语言

    测试流程

    测试发展方向

    纯功能测试没钱途,要么做管理,要么做技术,要么做架构。
    管理方面后续空了会再详细分享一些经验和心得
    技术相关的不用多说,自动化,性能,安全,超一个方向不断钻研,深挖到底就没错。
    架构的话东西就比较多了,这个也是抽空再做详细介绍吧。

    管理经验分享

    团队建设

    宫斗剧

    更新宫斗剧文章模板:
    本文章仅做记录,不得随意转载,里面内容纯属虚构,如有雷同,纯属巧合。如有侵权,请联系本人删除
    https://docs.qq.com/doc/DSWpLcVR5dWVQVXli

    展开全文
  • Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 统一标准的目的,是大家...

    百度定义:

    Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

    统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。

    软件开发中很重要的一个理念就是“解耦”,接口和接口实现就是在干这件事
    定好规范,任你实现,效率可高、可低,实现内容也可随时间变化而变化,但是调用关系是不变的。

    接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。

    一个类只能继承一个父类,但是可以实现一个或多个接口,实现多个接口,弥补了java类不能多继承。

    待续


    展开全文
  • 如果你是个Python初学者,那么你可以试着做做看这个教程,毕竟编程技能都是在实战中...百度搜索‘百度AI开放平台’,打开网页下拉,可以看到里边有很多的第三方接口,分别用于不同的智能需求;2、找到我们需要的功...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    用例只描述参与者和系统在交互过程中做些什么,并不描述怎么做。 用例图 关联关系 用例图 泛化关系 用例图 泛化关系 用例图 用例图 用例图 用例用于什么情况? 不知道什么情况不用用例 如果没有用到用例,...
  • 软件设计规范

    2015-03-11 11:57:50
    这也就反映为所谓不同的软件技术。所以,区分软件计算技术和应用问题的成分,是软件规范需要首先识别的东西。 解决问题。本质上是把问题装到变量里面的过程,是放大CPU寄存器的过程。表示层:(把局面、环境;起点和...
  • 初学者是怎么做的?小明一个刚入行安卓小萌新,刚刚在测试小姐姐那里交过学费(挨过骂)了解到软件开发过程中是需要区分正式、测试环境。但是他稍加思考就能想到测试、正式环境区别仅仅是host不一样而已,其他...
  • 软件开发阶段——待开发软件怎么做软件设计 概要设计 模块分解,确定软件的结构,模块功能和模块间的接口,以及全局数据结构设计 系统分析员、高级程序员 设计说明书、数据说明书、模块开发卷宗 详细设计 ...
  • 他人使用的软件设计经验。 这本书的目的就是将面向对象软件的设计经验作为设计模式记录下来。每一个设计模式 系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。我们的目标是将 设计经验以人们...
  • 所以这里我们针对不同的问题给出一些解决方法:(1)如果视频画面显示为花屏,这可能是由于安装摄像头的驱动程序与显卡驱动程序不兼容而造成的,这时需要升级显卡或摄像头的驱动程序。另外也有可能是摄像头与其它正在...
  • 西安软件培训作品

    2013-04-11 11:04:16
    未通过审核或还未审核的软件(本软件)授权的用户只在24小时内有效(24小时后必须重新授权,程序中会有提醒)。 (3).如果在模拟器上运行 发送图片微博可能会出问题,手机上一切正常,测试一个多月没有任何fc。 (4)...
  • 7.6 如果客户不告诉你怎么做的时候. 你应该怎么办........................... 83 7. 7 小结....................................... 83 第二部分基本态度 第8 章避免过度设计或设计不足…... 86 8. I 给开发人员...
  • 如果应用程序将调用从一个不同的IP,域或电子邮件系统将返回“许可证无效”的错误。您可以修改任何这些值后,或让动态IP,域相同的许可证密钥安装路径等工作。一个非常简单的API进行许可证验证,甚至可以集成新手。...
  • static factory 和 abstract factory 同:简化了创建过程。主要解决接口选择问题。 不同: ...需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来,以及这个汽车里...
  • 如何最大程度预防bug? 在接到产品需求进行开发前,怎么样...因为设计本身需要花费比较长的时间,所以并不是所有功能都要非常完整的设计,当然不同团队对设计也有不同的要求,大家选择对自己有意的内容去实践则
  •  健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步...
  • 若你作为一名管理员刚加入M公司,你认为快速原型法对公司的软件开发更加优越,请向公司副总裁写一份报告阐明你的理由,切记:副总裁不喜欢报告长度 超过一页(B5)。 参考答案提示: 应先简述瀑布模型的缺点,它已不...
  • 网管教程 从入门到精通软件篇 ★一。★详细xp修复控制台命令和用法!!! 放入xp(2000)光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)控制台命令是在系统出现一些意外情况下一种非常有效...
  • /*jdbc提供了两种方法识别字段,一种是使用getXXX(注意这里的getXXX表示取不同类型字段的不同的方法)获得字段名, 第二种*是通过字段索引,在这里我把第二种方法注释了*/ /*你可以访问这个连接获得getxxx的用法:...
  • 1)在软硬件接口中,CPU帮我们了什么事? 从硬件角度来看,CPU就是一个超大规模集成电路,通过电路实现了加法、乘法乃至各种各样处理逻辑。 从软件工程师角度讲,CPU就是一个执行各种计算机指令逻辑机器。...
  • 根据上面流程图可以看到如果是一步一步写程序,势必会让程序变得冗长且不易阅读,因而我想到使用循环方法,将流程图中类似结构体成一个循环体来实现,使程序源代码变得十分简洁,且容易被阅读和修改。...
  • 一:用贴图做软件盘,我可以计算出用户点击分别是哪个键,但是用什么接口发送给系统呢?并且它是怎么组织成字呢?需要我来提供字库吗? 答:在判断出用户点击键之后只需要把相应键值以事件形式传给系统...
  • 假设已有一个软件系统,你希望它能和一个新厂商类库搭配使用,但是这个新厂商所设计出来的接口不同于旧厂商的接口 你不想改变现有代码解决这个问题,所以应该怎么做的.这个你可以写一个类将新厂商接口转接成你所...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

不同的软件怎么做接口