软件测试之登录测试详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件测试之登录测试详解相关的知识,希望对你有一定的参考价值。

参考技术A 一、功能测试–登录

功能性测试用例包括:

1.什么都不输入,点击提交按钮,看提示信息。(非空检查)

2.输入已注册的用户名和正确的密码,验证是否登录成功;

3.输入已注册的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;

4.输入未注册的用户名和任意密码,验证是否登录失败,并且提示信息正确;

5.用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;

6.用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;

7.如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入正确的验证码,验证是否登录成功;

8.如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入错误的验证码,验证是否登录失败,并且提示信息正确。

9.用户名和密码是否大小写敏感;

10.页面上的密码框是否加密显示;

11.后台系统创建的用户第一次登录成功时,是否提示修改密码;

12.忘记用户名和忘记密码的功能是否可用;

13.前端页面是否根据设计要求限制用户名和密码长度;

14.如果登录功能需要验证码,点击验证码图片是否可以更换验证码,更换后的验证码是否可用;

15.刷新页面是否会刷新验证码;

16.如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;

17.用户登录成功但是会话超时后,继续操作是否会重定向到用户登录界面;

18.不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确; 19.页面默认焦点是否定位在用户名的输入框中;

20.快捷键 Tab 和 Enter 等,是否可以正常使用。

二、接口测试–登录

这里使用的登录接口是自己通过python写的

针对于接口测试可以使用工具或者自己编写脚本进行接口测试。

使用工具进行接口测试,这里我用的是国产的接口测试工具apipost,它还支持接口文档的生成。

在工具里面选择请求方法,现在一般使用的方法为:get、post。输入url:http://127.0.0.1:8888/login, 因为是登录还需要传递用户名和密码这两个参数,post方法在body携带参数,点击发生查看响应结果

自己编写脚本进行进行登录的接口测试,这里使用的是python+requests,如图:

三、性能测试–登录

针对于接口测试的性能测试我们可以使用jmeter,jmeter是java开发的一款轻量级的性能测试工具。

在做登录的性能测试的时候,需要考虑验证码的问题,要么去除验证码,要么设置一个万能验证码,这里还是用上面那个登录接口,进行性能测试。

打开jmeter,设置线程组,集合点、请求、查看结果树、汇总报告、聚合报告等,可根据自己的需求进行添加

编写登录的http请求,如图:

这里对一个接口并发十次,但是真正意义的登录性能测试,是多个用户进行登录。这里条件限制就用一个接口进行登录的并发测试。

查看并发的结果:

Python接口自动化之登录接口测试

在上一篇Python接口自动化测试系列文章:Python接口自动化之unittest单元测试

主要介绍单元测试,unittest模块特性、大致流程、源码及实战例子。

 

以下主要介绍接口概念、接口用例设计及登录接口测试实战。

 

                                            

 

01、什么是接口?

 

接口:检测外部系统与系统之间以及内部各个子系统之间的交互点。

 

通俗来说,接口就是连接前后端的桥梁,接口测试可以简单理解为脱离了前端的功能测试。一个又一个的接口就对应功能测试内一个又一个的功能。但注意,一个功能有可能不是一个接口就能实现。

 

那么,接口测试和功能测试的区别在哪呢?其实功能测试就是在页面上输入我们的参数值,点点点;而接口测试没有前端,而是通过接口文档上的调用地址、请求参数等,校验返回的结果值,也就是说,接口可以看成没有界面的功能测试。

 

因此,可以分析,系统间的接口包含三部分:输入处理逻辑输出

 

 

 

 

02、如何开展接口测试?

 

接口测试流程如下:

1.需求评审,熟悉业务和需求;

2.开发提供API接口文档;

3.根据开发交付的接口文档,编写接口测试用例;

4.接口测试用例评审;

5.开始执行接口测试;

6.提交测试报告;

 

 

 

03、如何设计接口用例?

 

 

▌1.获取接口文档

一般公司的开发会提供接口文档,没有接口文档的自行抓包吧(摸摸头),不知道怎么抓包的小伙伴,可以看看公众号的Fiddler系列文章。

ITester软件测试小栈推荐搜索      Fiddler

 

接口文档是我们测试时最重要的一个依据,一个规范的接口文档至少包括

1.接口说明;

2.调用URL;

3.请求方法(get、post等);

4.请求参数、参数类型、请求参数说明等;

5.返回参数说明;

如下为一个简单的登录接口文档:

 

 

2.分析接口文档的接口,提取测试点

接口测试用例跟常规的功能测试用例基本一样,可以从接口功能测试、接口业务测试、接口性能测试、接口安全测试等角度考虑。

 

接口的逻辑校验,可以参照接口流程图来进行设计,一个分支需要作为一个场景去进行测试,需要覆盖到流程图里面所有的逻辑分支。

 

接口的参数校验,可以参照接口文档中的参数定义去进行验证,需要覆盖到所有参数对应的枚举值以及错误码等信息。

 

 

3.接口测试用例设计思路

接口功能的关注点是:

1.接口参数正确与否:接口传入的参数是否有正确填写;

2.接口参数缺失:接口参数有必填、选填参数,传参时,测试参数缺失对结果的影响;

3.接口参数边界值:比如用户名、密码有长度限制,需要测试不同长度的参数对结果的影响;

4.接口参数类型:比如接口文档中用户名为String类型,测试传入其他数据类型对结果的影响。

 

4.接口测试其他范围

  • 接口业务测试

主要是从业务的角度出发,把接口组合成一条业务链,比如登录之后充值,在数据库中金额是否正确等等

                                                 

  • 接口的性能测试

是指接口是否满足业务的要求,比如业务要求系统可以满足50个人同时下单,那么下单这个接口就要可以承担50 TPS,目前业内一般使用JMETER去做接口性能测试,jmeter接口性能后续会单独在Jmeter系列文章里介绍。

 

  • 接口安全测试

接口的安全性主要围绕TokenTimestampSign三个机制展开设计,保证接口的数据不会被篡改和重复调用。

 

注意:本文主要涉及接口功能测试,相信做过功能测试的童鞋,设计接口测试用例也是没问题的。

 

 

 

04、接口测试用例实战

 

以下,我们以登录接口进行实战。

随着代码模块越来越多,混在一起,杂乱无章,这时我们考虑架构分层了,上篇文章:Python接口自动化之requests请求封装

封装的requests请求类,每个用例都要调用,可以放在公共模块里。

① 在项目下新建一个文件夹common,放入请求模块requests_handler.py

 

requests_handler.py

import requests
class RequestsHandler:
    def __init__(self):
        """session管理器"""
        self.session = requests.session()
    def visit(self, method, url, params = None, data= None, json= None, headers= None):
        result = self.session.request(method,url,params=params,data=data,json=json,headers=headers)
        try:
            # 返回json结果
            return result.json()
        except Exception:
            return \'not json\'
    def close_session(self):
        self.session.close()

 


②编写登录接口用例,调用封装的请求类。

登录用例,新建一个test_cases文件夹,用来存放用例模块。

 

test_Login.py

import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
    def setUp(self):
        # 请求类实例化
        self.req = RequestsHandler()
    def tearDown(self):
        self.req.close_session()
    def test_login_success(self):
        login_url = \'http://127.0.0.1:8000/user/login\'
        payload = {
            "mobile_phone": "1530272****",
            "pwd": "12345678"
        }
    
        res = self.req.visit(\'post\',login_url,json=payload)
        self.assertEqual(0, res[\'code\'])
if __name__ == \'__main__\':
    unittest.main()

 


运行结果为:

Ran 1 test in 0.213s
OK

 

对于用例的一些总结:

①setUp, tearDown。前置条件,后置条件,setUp实例化,在运行测试用例前获取session管理器, tearDown,在测试用例执行结束后关闭session管理器。

②对于断言,小伙伴们可能不知道到底用返回结果中的哪个字段断言。个人意见,如果code、msg比较详细的话,可以利用code、msg其中一个来断言,当然code、msg一起做断言也可以,甚至你觉得返回结果中某个数据符合你的预期,也是可以拿来断言,断言手段是灵活多变的,自行选择最优方案。

 

小伙伴们看到总结,退出微信,打开王者荣耀,一气呵成,其实还没完呢,我们写了正向用例,还有异常用例也写两条,更多的异常用例可以自行扩展下。

 

import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
    def setUp(self):
        # 请求类实例化
        self.req = RequestsHandler()
    def tearDown(self):
        # 关闭session
        self.req.close_session()
    def test_login_success(self):
        """
        正确手机号,正确密码
        """
        login_url = \'http://127.0.0.1:8000/user/login\'
        payload = {
            "mobile_phone": "1530272****",
            "pwd": "12345678"
        }

        res = self.req.visit(\'post\',login_url,json=payload)
        # 根据请求结果中的code进行断言
        self.assertEqual(0, res[\'code\'])
    def test_phone_is_null(self):
        """
        手机号为空,密码正确
        """
        login_url = \'http://127.0.0.1:8000/user/login\'
        payload = {
            "mobile_phone": "",
            "pwd": "12345678"
        }
       
        res = self.req.visit(\'post\', login_url, json=payload)
        # 根据返回结果中的msg进行断言
        self.assertEqual("手机号码为空", res[\'msg\'])
    def test_pwd_is_null(self):
        """
        正确用户名,密码为空
        """
        login_url = \'http://127.0.0.1:8000/user/login\'
        payload = {
            "mobile_phone": "1530272****",
            "pwd": ""
        }
    
        res = self.req.visit(\'post\', login_url, json=payload)
        # 根据返回结果中的msg进行断言
        self.assertEqual("密码为空", res[\'msg\'])
if __name__ == \'__main__\':
    unittest.main()
 

测试结果为:

Ran 3 tests in 0.259s
OK

 

以上代码如下痛点:

① 用例和数据未分离,维护成本大。可以数据与测试脚本分离,使用Excel存放测试用例,方便维护。

② 仔细研究发现正向用例、异常用例,只是传入的数据不一样,其他都是通用,这种情况下,我们可以引入ddt数据驱动,减少代码量。

 

总结:以上主要介绍了接口概念、接口用例设计及登录接口用例实战。

下一篇:Excel存放用例及封装类读取Excel数据。

 

更多系列文章,可以关注微信公众号:ITester软件测试小栈


以上是关于软件测试之登录测试详解的主要内容,如果未能解决你的问题,请参考以下文章

Python自动化测试之详解Unittest单元测试框架

Apache之ab测试工具详解

性能测试性能测试之性能测试指标详解(性能指标CPU内存负载磁盘)

性能测试性能测试之性能测试指标详解(性能指标CPU内存负载磁盘)

Web性能压力测试工具之WebBench详解

IO测试工具之fio详解