测试架构师 https://www.87testing.com 又一个WordPress站点 Wed, 06 May 2020 06:56:21 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.3.4 176494407 RSA加密的接口怎么编写Python脚本? https://www.87testing.com/2020/01/22/rsa%e5%8a%a0%e5%af%86%e7%9a%84%e6%8e%a5%e5%8f%a3%e6%80%8e%e4%b9%88%e7%bc%96%e5%86%99python%e8%84%9a%e6%9c%ac%ef%bc%9f/ Wed, 22 Jan 2020 01:00:27 +0000 https://www.87testing.com/?p=106 今天有同学问到:在调用接口的时候,传参被RSA加密了,应该怎么调用?在这里就简单说下,希望对其他同学有所帮助。

开始之前,先啰嗦两句,新型冠状病毒肺炎疫情汹涌而来。春节期间能不出门就不要出门了(^_^),如果非要出门,还是带上口罩、勤洗手。

为了接口的安全性考虑,有些接口在传递的时候使用了RSA加密,RSA加密是一种非对称加密,可以在不直接传递密钥的情况下,完成解密。服务端生成一对密钥(公钥和私钥),公钥是用来做加密使用的,私钥是用来做解密使用的。

那么,测试人员在调用接口进行测试的时候,只需要拿到公钥,并了解传递的参数是怎么拼接成一个字符串的即可,然后对字符串进行组装使用RAS加密后,再进行参数的传递即可。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


def handle_pub_key(key):
    """
    处理公钥
    公钥格式pem,处理成以-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的格式
    :param key:pem格式的公钥,无-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾
    :return:
    """
    start = '-----BEGIN PUBLIC KEY-----\n'
    end = '-----END PUBLIC KEY-----'
    result = ''
    # 分割key,每64位长度换一行
    divide = int(len(key) / 64)
    divide = divide if (divide > 0) else divide + 1
    line = divide if (len(key) % 64 == 0) else divide + 1
    for i in range(line):
        result += key[i * 64:(i + 1) * 64] + '\n'
    result = start + result + end
    return result


def encrypt(key, content):
    """
    RSA公钥加密
    :param key: 无BEGIN PUBLIC KEY头END PUBLIC KEY尾的pem格式key
    :param content:待加密内容
    :return result:返回RAS加密后的字符串
    """
    pub_key = handle_pub_key(key)
    pub = RSA.import_key(pub_key)
    cipher = PKCS1_v1_5.new(pub)
    encrypt_bytes = cipher.encrypt(content.encode(encoding='utf-8'))
    result = base64.b64encode(encrypt_bytes)
    result = str(result, encoding='utf-8')
    return result


if __name__ == '__main__':
    rsa_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8RVzwz5UHyJdunvDL7yYTnsTIhXipj33BKV8AjbPsDJ35WlfViOGw+deRgwVtruKRCEyqi2SBkwcu1Sdp6gPbELW1mkiTS2QT/Tnj3E2iEIqWKEUJW27PfJCPKE83+UD+zflDVB/LEdinOaFjCf6h/SaznarsXhx0zSYU9wjhmQIDAQBA'
    password = 'qwer1234'
    pwd = encrypt(rsa_key,password)
    print(pwd)

执行结果:

D:\tttesting\workspace\venv\Scripts\python3.exe D:/tttesting/workspace/c/encrypt.py
Zd5DNbfX5w8u+FWF4mHoLXQJEy+RTmjzxq6kgNIKKhfrx8o3I9JzX57Ya4N3O69WAWeUh6XVQhrTTJhPke456EyNGi9r74NN3K6YAcN6maJm4py6Kc3gyg6HKfjkRiQv4ZZTf/qCPobdyZkbBiowLmfdCg/t8EN0DAj30G1j5T8=

Process finished with exit code 0

以上例子可以看出,使用公钥rsa_key对password进行RSA加密后得到code的值就可以作为接口的传参了。

]]>
106
搭建接口自动化测试课程中的被测系统『Docker篇』 https://www.87testing.com/2019/12/25/%e6%90%ad%e5%bb%ba%e6%8e%a5%e5%8f%a3%e8%87%aa%e5%8a%a8%e5%8c%96%e6%b5%8b%e8%af%95%e8%af%be%e7%a8%8b%e4%b8%ad%e7%9a%84%e8%a2%ab%e6%b5%8b%e7%b3%bb%e7%bb%9f%e3%80%8edocker%e7%af%87%e3%80%8f/ Wed, 25 Dec 2019 01:00:18 +0000 https://www.87testing.com/?p=104 参加过我们Python接口自动化测试的同学都知道,在实战中,我们使用的是一个电商管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。是现阶段比较流行的技术实现的。也是目前大部分公司都在使用的,同时也引入了文档生成工具Swagger-UI,使用Swagger查看接口文档在公司也越来越常见。



Docker得到越来越广泛的应用,那么对于我们测试人员,一些Docker相关知识及命令也要掌握,今天这篇文章,先介绍下Docker相关知识,希望对大家有些帮助。

一、Docker简介

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,使用Docker可以更方便的打包、测试及部署应用程序。

二、Docker环境安装

1、安装yum-utils:

yum install -y yum-utils device-mapper-persistent-data lvm2

2、为yum源添加docker仓库位置:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装docker:

yum install docker-ce

4、启动docker:

systemctl start docker

三、Docker常用命令

在docker hub官网:https://hub.docker.com
查看镜像支持的版本,然后下载镜像:
比如下载java镜像:

docker pull java:8

下载nginx镜像:

docker pull nginx:1.10

列出镜像:

docker images


删除指定名称镜像:

docker rmi java:8

强制删除指定名称镜像:

docker rmi -f java:8

强制删除所有镜像:

docker rmi -f $(docker images)

新建并启动容器(以nginx为例):

docker run -p 80:80 --name nginx -d nginx:1.10

# -d:表示后台运行
# --name:制定运行后容器的名字为nginx,之后可以通过名字来操作容器
# -p:指定端口映射,格式为:hostPort:containerPort

列出运行中的容器:

docker ps

列出所有容器:

docker ps -a

停止容器:

docker stop $ContainerName(或者$ContainerId)

比如停止nginx:

docker stop nginx  或 docker stop 725e081ad097

强制停止容器:

docker kill $ContainerName(或$ContainerId)

启动已停止的容器:

docker start $ContainerName(或$ContainerId)

进入容器(先查出容器的pid,然后再根据容器的pid进入容器):

# 先查出容器的pid
docker inspect  --format  "{{.State.Pid}}"  $ContainerName(或者$ContainerId)
# 然后再根据容器的pid进入容器
nsenter --target “$pid” --mount --uts --ipc --net --pid

删除指定容器:

docker rm $ContainerName(或$ContainerId)

强制删除所有容器:

docker rm -f $(docker ps -a -q)

查看容器的日志:

docker logs $ContainerName(或$ContainerId)

查看容器的ip地址:

docker inspect --format '{{.NetworkSettings.IPAddress}}' $ContainerName(或$ContainerId)

查看指定容器cpu、内存、网络、io情况:

docker stats $ContainerName(或$ContainerId)

查看所有容器情况:

docker stats -a

进入docker容器内部的bash:

docker exec -it $ContainerName(或$ContainerId) /bin/bash

四、Docker的出现对测试也带来了一些促进作用

1、环境的统一

在 Docker 下我们不用再纠结多套环境运维、管理的问题,也更加不用考虑不同环境之间的差异。 Docker 完全可以快速的部署一套清洁的环境,供我们进行各项软件生命周期活动。

2、降低配置的压力

很多时候应用会依赖于很多配置,比如数据库、防火墙、队列、缓存等等,Docker 呢,就可以通过打包镜像,将这些配置一起打包到镜像中,也进一步保证了环境的统一。

3、资源利用

由于容器不需要进行硬件模拟、也不需要运行完整的操作系统,所以容器的执行速度、内存消耗都要比虚拟机更高效,性能也更好。

4、问题的复现

传统的环境配置里,生产上的问题往往很难在测试环境重现,让我们在 BUG 复现上会耽误太多的时间,更难定位问题出现的原因。而 Docker 的特殊性就在于可以快递通过镜像复制出现问题的场景,更快速的定位分析问题。同样的,在对于测试与开发的沟通上亦是如此。

5、持续集成的支持

传统的持续集成还是停留在应用方向,而配合 Docker,通过 Docerfile 来进行镜像构建,效果更好。

6、环境的迁移

我们经常遇到某些环境的迁移,比如机房的迁移、平台的迁移等等。传统情况下我们的部署、迁移和迁移后的测试是一个非常大的工程,而有了 Docker,基于 Docker 的兼容性,可以很轻松的进行迁移。

由此可见,Docker让我们变得更加高效。好了,Docker篇今天就介绍到这里,希望对你能有所帮助。

####最后,给我们自己打个广告:Python接口自动化二期实战课程报名12月31号马上就要截止了,只要认真学习,能够基于自己公司项目进行接口自动化测试的应用和落地那都不是问题。名额不多了,请联系微信:alice_in_1988咨询并领取大额优惠券。

]]>
104
*args及**kwargs的使用方法 https://www.87testing.com/2019/11/28/args%e5%8f%8akwargs%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/ Thu, 28 Nov 2019 10:47:14 +0000 https://www.87testing.com/?p=102 其中有个我们python接口自动化测试实战的一期学员看到对代码里面的*args及**kwargs非常困惑,所以在这里做个记录,希望对后来看到此文的同学能有所帮助。

# coding:UTF-8
"""
*args的使用方法:
用来将参数打包成tuple给函数体调用
"""


# 举例1
def func1(*args):
    print(args, type(args))


func1(1)


# 举例2
def func2(x, y, *args):
    print(x, y, args)


func2(1, 2, 3, 4, 5)


"""
**kwargs的使用方法:
打包关键字参数成dict给函数体调用
"""


# 举例1
def func3(**kwargs):
    print(kwargs, type(kwargs))


func3(a=2)


def func4(**kwargs):
    print(kwargs)


func4(a=1, b=2, c=3)


def func(arg, *args, **kwargs):
    print(arg, args, kwargs)


func(6, 7, 8, 9, a=1, b=2, c=3)

如上代码执行结果:

1 2 (3, 4, 5)
{'a': 2} <class 'dict'>
{'a': 1, 'b': 2, 'c': 3}
6 (7, 8, 9) {'a': 1, 'b': 2, 'c': 3}
]]>
102
基于Python3接口自动化测试从0到测试方案落地 https://www.87testing.com/2019/10/22/%e5%9f%ba%e4%ba%8epython3%e6%8e%a5%e5%8f%a3%e8%87%aa%e5%8a%a8%e5%8c%96%e6%b5%8b%e8%af%95%e4%bb%8e0%e5%88%b0%e6%b5%8b%e8%af%95%e6%96%b9%e6%a1%88%e8%90%bd%e5%9c%b0/ Tue, 22 Oct 2019 01:00:04 +0000 https://www.87testing.com/?p=100 希望这篇文章可以
  • 帮助有一点代码基础的测试伙伴独立动手搭建一套完整、高效、可读性好、便于维护的接口自动化系统
  • 帮助给出一些在自动化过程中因环境,业务,甚至人员配合等原因造成阻力的解决方案
  • 让大家拍砖,帮助我更好的对它进行优化和扩展

自卖自夸

  • 目前这套系统已维护一家中大型互联网企业核心交易线服务1年半时间,累计用例数量2万条,覆盖率在85%以上,质量保障效果显著
  • 在业务项目中不断演进优化,在脚本输出效率,代码覆盖率以及应对常见的开发设计模式都有较好的表现(非平台)
  • 开发都觉得好才是真的好!!!

一套东西不可能应对所有情况,但也希望对大家有所帮助,废话不多数,开始。


认识接口

当我们做任何新产品测试时候,第一件事情就是要先认识被测体,接口测试也一样。

什么是接口?

接口的标准定义这里就不赘述了,那我们通常测试的接口是什么?举个例子,当我们点击打开一个商品页面时,客户端需要调用==商品详情接口==,目的是希望通过这个接口告诉服务端商品的ID(即唯一标识)并要求服务端返回这个商品的详细信息,这就是我们最长提到的接口。

接口的组成?

我们知道接口有很多概念包括:http接口、api接口、RPC接口、RMI、webservice、Restful等,下面以我们最常见的http接口为例,如果我们把一个接口看成一个对象那么它主要包含如下属性:

class RequestUtil(object):
    """
    接口基础类
    """
    def __init__(self):
        self.host = None  # 域名:http://my-api-test.com
        self.uri = None  # /mydemo
        self.url = None  
        # url host+uri+param
        self.info = None  # 接口描述
        self.method = None  # 请求方式 post get put等等
        self.body = None 
        # 请求参数体 例如 
        {"product_id": 123456}
        self.param = None  
        # get请求参数 例如 product_id=123456
        self.resp = None  
        # 返回结果,例如 
        {"product_name":'abc',"price":5.11}
        self.is_sign = None  # 签名 
        self.key_token = None  # token
        self.headers = headers 
        # 请求头 例如 
        {'Content-Type': 'application/json'}
        self.status = 0  # 期望的接口返回结果中代表失败、成功状值
        self.success_status = 0  # 接口成功时的status值
        self.http_status = 200  # http返回码
        self.timeout = 15  # 最大超时时间
        self.mock_info = BaseObj()  # 如果接口中需要mock的话,存放mock信息

    def send_request():
        """发送请求,使用requests库来实现该功能"""
        pass

可以看到上面已经生成的我们接口最基础的类,包含了我们后续需要用到的所有属性,并且它还应该包含一个重要的功能就是组织好这些属性然后发送请求并记录请求的所有数据,这里使用的是requests库来实现这个功能。

如何获取接口结构?

通常我们会根据每个公司不同的情况按照优先级从高到低排序有如下获取方式:

推动开发提供以上文档推荐直接接swagger,可以要求开发将参数是否必填和描述等信息写在会用到的参数后面,以此来弥补没有wiki的部分,这样我们解析拉出的脚本中参数就都有具体的描述信息了,非常方便,如下图中内容就是直接从swagger页面解析的脚本

# 以下代码从swagger拉取生成,可从swagger重新拉取更新

from common.objects import BaseObj
from ..__init__ import *


class MyServiceBaseDemoApi(BaseServiceDemo):
    """接口对象"""
    def __init__(self, **kwargs):
        super(MyServiceBaseDemoApi, self).__init__()
        self.info = "my demo接口例子"
        self.uri = "mydemo"
        self.method = "post"
        self.body = self.Body(**kwargs)
        self.resp = self.Resp()

    class Body(BaseObj):
        def __init__(self, **kwargs):
            self.name = None  # 必填,用户姓名
            self.age = None  # 非必填,用户年龄
            self.phone_num = None  # 必填,用户手机号码 必填,用户手机号码
            BaseObj.__init__(self, **kwargs)

    class Resp(object):
        def __init__(self):
            super(MyServiceBaseDemoApi.Resp, self).__init__()
            self.status = None  # None
            self.msg = None  # 公司ID
            self.data = self.Items()  # 公司ID

        class Items(object):
            def __init__(self):
                self.name = None
                self.age = None

熟悉被测服务

除了认识单个的接口,我们还需要了解被测服务的架构以及该服务是如何和其他服务或客户端进行数据交换来完成产品的部分功能,举个例子:在交易流程中通常会包括以下几个服务

这快信息可以直接从开发那边获取,通常开发会有类似的业务架构图,只有了解了这快我们才可以比较准确的来制定相关项目的测试方案,避免漏测,错测。

熟悉一门语言

目前我使用的是python3,当然你们也可以选择java或者其他合适的语言,虽然语言不同,但很多思路和解决问题的方式都是互通的;以python为例,应用要求至少能熟悉到python对象的处理,具体语法这里就不赘述了,百度一下很多,自己比较推荐廖雪峰的python教程,因为比较容易入手。

了解相关依赖库

后面会主要用到以下依赖库,可以提前了解下基本的功能和调用方式

peewee>=2.10.2  # 数据库orm
peewee-mssql>=0.1.2
pymysql  # mysql
redis>=2.10.6  # mock部分的key会存储在redis中
requests>=2.18.4  # http请求的发送,也可以使用aiohttp或其他类似库替换
selenium>=3.8.0  # 接口和ui自动化结合时候可能会需要用到
threadpool>=1.3.2  # 业务并发
pytest=4.3.1  # 自动化测试框架,也可以选择其他类似框架
pytest-html  # pytest生成报告插件
parameterized  # 参数化用例需要使用到

常见接口测试方案

抛开业务,广义上我们主要用到两种测试方案

方向 方案
用例方向 1.单接口测试;2.多接口串流测试
断言部分 1.新老服务对比结果;2.根据业务逻辑计算期望结果和实际结果做对比;

用例方面:

  • 推荐大部分接口尽量都需要有单接口或短流程的测试用例;
  • 流程型较强的业务例如拼团等,必须要加入全流程串流测试;

结果检查:

  • 重构,分库分表等其他不改变业务逻辑的技术型项目非常适合新老服务接口对比测试。==优势==:脚本无需自行生成期望结果,只需对应新老结果即可,脚本量大幅度减少;期望结果可靠性非常高;
  • 根据实际的业务逻辑来自行生成接口返回结果or落库数据的期望结果,一个接口仅包含一个check方法。==优势==: 维护成本稳定,不会随着用例的大幅增多而激增;可实现数据的全量对比,大幅度提高代码覆盖率。
]]>
100
裁员潮,带给我的思考 https://www.87testing.com/2019/08/31/%e8%a3%81%e5%91%98%e6%bd%ae%ef%bc%8c%e5%b8%a6%e7%bb%99%e6%88%91%e7%9a%84%e6%80%9d%e8%80%83/ Fri, 30 Aug 2019 16:10:43 +0000 https://www.87testing.com/?p=98

今年会经常听到:xxxP2P公司跑路了,xxx理财提现无法回款了…

8月26号马云在2019中国国际智能产业博览会上表示,P2P不是互联网金融,是有网页的非法集资产业。

除了倒下不少P2P公司之外,也会有一些其他互联网企业大量裁员,那么,同时也会导致一大部分人面临重新找工作。

现在大环境不好,2019年初美团CEO王兴就感慨:2019年是过去10年里最差的一年,却是未来10年里最好的一年。听着有点晕,可能是真晕了吧,在去年12月中旬就发出这个感慨的时候,顿时“优化”掉200名员工。这点,让大家明白,其实每个老板对经济发表感慨的时候,尤其是这种承上启下句式的时候,就要小心被裁员了。

话说回来,从2018年末到现在为止,这段时间,裁员、调整公司内部结构的企业比较多,像阿里,西南证券、特斯拉、富士康、滴滴、京东、蔚来汽车等等,都在做。好像没有几个行业,在扩张,大规模招人,从传统行业房地产、钢铁、能源到互联网新贵、金融行业,能保住饭碗就已经不错了。

昨天突然看到自己朋友圈,上家公司的同事也在依依不舍,各自道别。说实话,自己心里也挺多感慨的,也有些许忧伤,毕竟在上家公司待了4年多。只有默默地为他们祈祷,希望接下来都能够找到自己满意的工作。

现实很残酷,要坚持学习。最近自己也在一直思考总结:

安于现状,就是在坐等被淘汰,要有危机感,要好好储备,让自己的能力不断提升,不断历练自己,才能被市场认可。很多人之前运气好,赶上企业高速增长招聘热潮,多少有些运气成分,但是运气只是一时的,随着公司的发展,如果胜任不了目前的岗位,随时都有可能被淘汰,实力才是永恒的。

利用好日常空闲时间,不断学习。有些人可能就会反驳了,平常工作那么忙,哪有时间学习?时间是挤出来的,不说别的,每天利用好上下班在公交地铁上的时间。如果不知道怎么提升自己,多看看一些巨头公司的招聘要求,找出共性,然后给自己制定学习计划,去提升,现在想系统学习某知识,资料就太多了,某宝也都可以找到。

如果在一家公司工作很安逸,安逸意味着你的工作按部就班,没有什么挑战。这样慢慢的就会消耗你的上进心,因为太舒服了,及时遇到好的机会,也会变得胆怯,怕适应不了新的环境和新的团队,怕有更多的不稳定…安逸是慢性毒药,它会扼杀你的创造力和进取心,安逸也就意味着在逐渐失去竞争力。

所以,谁也不知道明天会发生什么,坚持学习,让自己变得更有实力。居安思危,走出舒适区,不断历练自己。另外,在做好主业的前提下,也能找到副业的机会。

以上思考,时刻提醒自己,同时,希望对看到此篇文章的朋友,也能有些许的帮助和思考,如果对你有一丁点的帮助,麻烦动下手指,点击右下角“在看”,谢谢!

————————————————————————-

识别小程序,查看更多

—————————————————————————–

本篇文章来源于微信公众号: 测试架构师

]]>
98
自动生成测试脚本方案浅析 https://www.87testing.com/2019/05/13/%e8%87%aa%e5%8a%a8%e7%94%9f%e6%88%90%e6%b5%8b%e8%af%95%e8%84%9a%e6%9c%ac%e6%96%b9%e6%a1%88%e6%b5%85%e6%9e%90/ Mon, 13 May 2019 06:49:46 +0000 https://www.87testing.com/?p=96 构想篇

作为一名接口自动化测试工程师,日常面临最多的工作就是编写接口自动化测试脚本,那么,在 coding 的过程中最让你觉得枯燥和乏味事情有哪些?

痛点

  • 每次拿到新接口,我们要手动参照文档在脚本中生成一份接口类,参数越多花费时间越多

  • 需求不同,但健壮性和部分业务用例重复性高

  • 想重构脚本,接口数据和用例这块纯编写的工作量就会让人望而怯步

每天都要花上30%的时间去写那些不太需要思考的脚本,这真不够自动化!

解决方案

  • 解析文档

  • 梳理适合自动生成的脚本

  • 通过工具生成这部分脚本

预期目标

解放双手,降低纯手力劳动占比,进而给自己提供更多的时间去思考、理解产品和设计更多“聪明”的用例

实践篇

自动化获取接口信息

分析接口自动化脚本结构和内容

自动化测试脚本结构图

筛选工作量大又有规律可循的脚本

此处规律不宜太过于复杂,可先选逻辑简单的部分,我们主要选取以下两部分

  • 接口类,工作时间占比30%~50%,特点:结构特定、数据来源于其它平台

接口类结构图


  • 用例部分,工作时间占比30%~50%,特点:重复度高于80%左右、生成逻辑可描述

用例结构图

解析接口文档

接口信息来源于接口文档,目前市场上比较主流的几个接口文档管理工具有Swagger、RAP、WIKI 或者其他普通文档工具。

下面以解析接口文件为目的分析比较下几款工具的区别:
.

分类 Swagger RAP WIKI
描述 用于生成、描述、调用和可视化RESTful风格的Web服务的框架 可视化接口管理工具 可供多人协同创作的超文本系统
格式 json json html
规范 各个参数、返回值的具体结构、类型有统一规范 同swagger 需要自己约定规范
成本 直接嵌入项目中,通过开发时编写注释,自动生成接口文档,成本较低 需要开发按照平台规则手动输入,成本较高 需要按照约定规范,手动输入,成本较高

如果有条件,大家可以根据开发成本和解析接口文件的难易程度来综合考虑,确定使用哪个平台管理接口

我们项目是 Swagger 和 WIKI 混合使用,由于日常测试看 WIKI 居多,因此早期采用 Python 爬虫利器 BeautifulSoup 来解析WIKI html页面

  1. from bs4 import BeautifulSoup

  2. soup = BeautifulSoup(html_doc)

  3. title_string = soup.title.string

  4. # 后面继续解析其他需要用到的接口内容

使用下来发现通过wiki来获取接口信息的一些弊端

  1. 完全靠人工来约束书写规则不靠谱

  2. 对于复杂的嵌套参数,稍有不按照规范来的,就会导致脚本解析错误,很大程度上造成了解析的难度

  3. 在html上准确的定位信息远比在json上难度大,兼容性差

于是,尝试解析Swagger返回的json来获得接口信息为后面生成脚本做准备

  1. {

  2.    "swagger": "2.0",

  3.    "host": "xxx",

  4.    "basePath": "/",

  5.    "tags":[

  6.        {"name":"xxx-controller","description":"xxx"},

  7.        ...

  8.    ],

  9.    "paths": {

  10.        "<接口地址1>": { ... },

  11.        "<接口地址2>": { ... },

  12.        ...

  13.    },

  14.    "definitions": {

  15.        "<实体类1>": { ... },

  16.        "<实体类2>": { ... },

  17.        ...

  18.    }

  19. }

使用以下方式拿到json结果后,就可以直接按照处理字典的方式来获取需要的内容。

  1. graph LR

  2. json-->ApiObj

对于swagger.json的解析和代码生成官方也提供了一些可供使用的库swagger-codegen (java),由于编程语言的限制,我们使用了python自己解析

现在,我们已拿到生成代码所需要的信息

自动生成代码

代码生成工具

  1. class CodeGeneratorBackend():


  2.    def begin(self, tab="t"):

  3.        self.code = []

  4.        self.tab = tab

  5.        self.level = 0


  6.    def end(self):

  7.        # return string.join(self.code, "")

  8.        return "".join(self.code)


  9.    def write(self, string):

  10.        self.code.append(self.tab * self.level + string)


  11.    def indent(self):

  12.        self.level = self.level + 1


  13.    def dedent(self):

  14.        if self.level == 0:

  15.            raise SyntaxError("internal error in code generator")

  16.        self.level = self.level - 1



  17. """调用方法,开始生成代码"""    

  18. c = CodeGeneratorBackend()

  19. c.begin(tab="    ")  # 定义缩进方式

  20. c.write("def function(self):n")

  21. c.indent()  # 缩进

  22. # 方法体

  23. c.dedent()  # 回退上一次缩进

接口类部分脚本生成规则

由于我们接口属于是存储在类结构中,因此根据当前脚本的API Object接口进行遍历替换即可

接口用例部分代码生成规则

特殊值用例

给每个参数生成为0、None、空字符串这样特殊值的用例

定位参数类型

通过接口参数给出的类型,生成符合该类型的值,和一些不符合参数类型的值(健壮性),赋值后生成用例,如下代码示例

定位特定关键词参数

  • 遇到page相关参数可生成分页用例,具体分页测试用例细节就不赘述

  • 遇到类似starttime,endtime参数,可生成两个时间参数和当前时间前后比较的用例,两个时间参数前后比较的用例


该生成规则需要和开发约定一些基本原则,另外也需要我们在日常测试中多归纳总结,找出那些有固定规律的用例,想办法定位生成这类用例

定位接口类型


  • 查询类接口:可生单参数查询、组合参数查询、全参数查询等用例

  • 更新类接口:可生成单条更新每个参数,组合更新,全量更新等用例


自动生成测试脚本工具介绍

框架流程图

工具扩展性


  • 用例生成规则可扩展,从框架图中可以看到,用例规则这快自成独立模版,可单独维护,便于后续新规则的加入

  • 代码模版可扩展,不同团队对于代码规范、基础模版的样式都不一样,可自定义生成模版的样式,增加了工具的灵活性

  • 支持多种数据类型转换,后续可扩展生成API对象、参数字典或其他数据模式


成果和后续行动

效率提升

以一个优惠券需求为例,大约新增/更新了10个接口(约150个参数请求参数,100个返回参数),包含增删改查几种类型,编写加调试脚本在使用工具前后所花费时间对比,如下:

类型 工作量描述 不使用工具 使用工具 效率提升
接口类 约250个参数 2日/人 1小时内 94%
健壮性用例 约1000条用例 2日/人 1日/人 50%
平均 74%

从上例可以看出使用脚本后的效率提高了近一半,而从设计到编写完第一版工具仅花费了2~3个工作日,还是非常值得一做的。

聚焦测试

  • 脚本编写工作量的减少,会增加产品测试思考的时间,完善用例,检查覆盖面等

统一规范


  • 统一了接口类输写规范,便于团队内部维护和理解脚本

  • 统一基本用例生成思路,规避测试工程师在设计基本用例设计时有所遗漏;统一用例输出格式,便于他人理解和维护用例


重构利器

  • 如果有计划做脚本重构,使用工具后可以成倍的节省编写接口信息和用例部分脚本的时间


后续迭代优化点


  • 目前用例的生成思路大多还局限在单参数上,多参数的生成思路还较少,后续会通过头脑风暴等形式来扩展更多的用例的生成思路

  • 通过实际调用接口,获取结果,提高自动生成用例期望结果的准确性,继而节省更多对部分期望结果做调整的时间投入


最后想说的是,这个小工具的设计思路远比实现更重要,无论使哪种语言或库都可以实现解析文件和代码的生成,重要得是按照怎样的思路去生成脚本,在这部分上后续我们也有很多需要摸索的地方。

测试架构师小程序上线了,欢迎点击下方二维码体验哈~~


本篇文章来源于微信公众号: 测试架构师

]]>
96
uiautomator2自动化测试系列(一) https://www.87testing.com/2019/04/19/uiautomator2%e8%87%aa%e5%8a%a8%e5%8c%96%e6%b5%8b%e8%af%95%e7%b3%bb%e5%88%97%ef%bc%88%e4%b8%80%ef%bc%89/ Fri, 19 Apr 2019 06:23:21 +0000 https://www.87testing.com/?p=94

先说个消息哈:测试架构师小程序上线了,欢迎点击下方二维码体验哈~~

背景介绍

Google提供的uiautomator库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,但有两个缺点:

  1. 只能使用Java语言 ;

  2. 必须每次被上传到设备上运行;

为了解决以上缺点,才有了uiautomator2。uiautomator2是一个Android UI自动化框架,支持Python编写测试脚本对设备进行自动化。

基本原理

uiautomator2的底层是基于Google uiautomator,原理是在手机上运行了一个http服务器,将uiautomator中的功能开放出来,然后再将这些http接口,封装成Python库。(基本要求是Android >= 4.4 Python >=2.7 || <= 3.7)

三言两语不足以表达出工具的强大和许多技巧。下面我们从github上文档来学习,原文地址:https://github.com/openatx/uiautomator2

环境准备及代码思路介绍

安装之前请先确保adb已经安装,并且已添加到环境变量中。

  • 安装更新最新的版本uiautomator2:

pip install --upgrade --pre uiautomator2
  • 拉取github,并安装uiautomator2

git clone https://github.com/openatx/uiautomator2pip install -e uiautomator2

以上两种方式都可以安装,除此之外pillow也是需要的,因为截图功能需要这个模块

pip install pillow

装本库所需要的设备端程序:uiautomator-server、atx-agent、openstf/minicap、openstf/minitouch,通过以下命令:

python -m uiautomator2 init

注:在命令行中启动Python脚本的时候,经常会用到-m参数,那么-m起了什么作用呢?

通过python –help 我们可以看到:

意思是将库中的python模块用作脚本去运行(就是运行包下的__main__.py文件)。那么我们就去__main__.py包中去看下到底做了什么操作,以下是源码的一部分

main函数方法其实很简单,就是接受解析命令行参数,来执行函数,类似shell脚本,我们可以通过python -m uiautomator2 来看看到底有哪些功能

也就是这个MyFire类下面的函数功能

从函数名,我们也就得知了有哪些功能,这里就不多介绍,那么我们再次回归到本次步骤的开头,python -m uiautomator2 init的操作,那么我们来看main主函数的方法

这里接受命令行参数接受的是init ,从代码来看这里是存在有一个私有变量_commadns,可以看到是

这里就执行了cmd_init函数,功能如下

执行了一些初始化操作,也就是开头所讲的安装uiautomator-server、atx-agent,openstf/minicap、openstf/minitouch客户端到终端的操作。

包含一系列的下载并通过adb安装到手机(这里就需要手机开发者权限)

有时候init也会出错,请参考手动Init指南:https://github.com/openatx/uiautomator2/wiki/Manual-Init(这里不做介绍,其实原理就是通过adb安装几个apk…)

  • 安装ui查看器(目前最新的稳定版为 0.1.0)

pip install -U weditor

Windows系统可以使用命令在桌面创建一个快捷方式

 python -m weditor --shortcut

命令行启动 python -m weditor 会自动打开浏览器,输入设备的ip或者序列号,点击Connect即可。

以上是uiautomator2安装环境的配置所有操作。相比于appium是不是“轻量”了很多。你不需要安装node,Android sdk等,也不会因为翻墙安装appium客户端,或者镜像安装等一些系列的操作。当然和最近据说很流行的Airtest,只能说各有千秋吧,待介绍uiautomator2完,将分享airtest。

当我们去用一个框架的时候,必须要知道其原理,最好去看源码了解是怎么实现的,同时,去学习框架的思路。



]]>
94
创业从兼职再到全职投入 https://www.87testing.com/2019/03/04/%e5%88%9b%e4%b8%9a%e4%bb%8e%e5%85%bc%e8%81%8c%e5%86%8d%e5%88%b0%e5%85%a8%e8%81%8c%e6%8a%95%e5%85%a5/ Mon, 04 Mar 2019 01:00:43 +0000 https://www.87testing.com/?p=92
1. 先兼职完成探索的闭环,赚到第一块钱,兼职完不成赚一块钱的目标,全职也很难。只有当闭环走完,明显的瓶颈出现在时间投入上时,全职才有意义。

  1. 做好至少半年以上没有收入的准备,特别是做产品,没有几个月潜心的打磨产品,基本是不可用状态,现金压力太大,动作会变形,动作变形,产品做不好,进入恶性循环。

  2. 先复制别人的模式,很多看起来轻松简单赚钱的事情,自己动手去试试,就发现没那么简单,但也不要被吓到,专注的扎进去一段时间,会发现也没那么难。

  3. 所谓的人脉、资源,没那么靠谱,不要太相信说给你很多资源的人,只有当你真正的给他们提供不可或缺的价值,他们才会长期的依赖你.本质上都是利益交换。

  4. 不要迷恋裂变、流量玩法、增长黑客这些概念,从O到1打造一个产品或商业模式,并把他从0推到1,从1推到100的能力,这个才是壁垒,光会玩流量是给别人做嫁衣,正如资本会往收益率高的地方流动,流量也是。

  5. 不要一上来就做平台,先搞定某一个细分市场的某一边,甚至是只要跟某边的关键人建立起关系,再逐步长大、放大,成为某边资源的代表,进而去拓展另一边,最后发展成平台,平台是长出来的,不是规划出来的。

没有捷径,没有什么上两天课就成大神、五天速成的高手的,如果有,那么一定是别人前期的积累已经快达成质变的过程!

]]>
92
《创业就是要细分垄断》读书笔记 https://www.87testing.com/2019/02/14/%e3%80%8a%e5%88%9b%e4%b8%9a%e5%b0%b1%e6%98%af%e8%a6%81%e7%bb%86%e5%88%86%e5%9e%84%e6%96%ad%e3%80%8b%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/ Thu, 14 Feb 2019 01:00:31 +0000 https://www.87testing.com/?p=90

创业公司要找到一个细分市场

在互联网领域,垄断才是核心,而不是竞争。创业公司要找到一个细分市场,然后垄断它,再逐渐地扩大。

创业的时候,专注是非常重要的

亚马逊刚成立的时候,它会研究什么东西最能够卖得出去,因为书能够保存、不容易坏掉,所以它最开始卖书。书卖了一年,第二年它有没有卖别的东西呢?没有。第三年也没有,第四年还没有。为什么呢?因为它还没有拿到垄断地位。创业者在创业时一定要把某样东西真的垄断了,再做下一件事。因为创业的时候,专注是非常重要的。一开始什么都做,最后什么都做不好。

从商业史中能学到的三点

第一,如果你的公司成为一个垄断性的公司,它的价值会比其他所有竞争对手加起来都要大无数倍;
第二,一定要从非常小的专注点做起,其他的事情不要做;
第三,成功者一般会经历垄断五步曲:分析、实战、增长、扩张、巩固(如下图)。

创业中最重要的两个因素

第一、是对现状和未来的独立思考,而且是非常深切的思考。创新工场投的公司里做得非常好的,从某种意义上说,它们无论是打法,还是当时面临的市场机会,都是独一无二的。要想获得独特的成功,最重要的是独立的思考。

第二、是强大的执行力,能迅速将思考进行迭代、尝试,一旦成功就进行扩大。

但在很多情况下,大部分创业者会把非常多的时间花在第二点上,就是强大的执行力上,有时候会有意无意地忽视对于现状、未来进行非常深入的独立思考。这个独立思考必须是真正独立的,并不是外面做什么我就跟着做,但也不因为外面都这么做,我就不去做。如果仅仅是标新立异,故意反趋势、反潮流,其实也不是独立思考。创业者要牢记一点:没有什么固定的真理,或者一定要怎样做。

垄断的六要素

垄断不是没有可能

如果在一个领域你发现做不到垄断,千万不要因此放弃这个市场,或者认为这个市场的垄断是不可能的。因为垄断本身是针对需求,而不是产品形态。这对你来说反而是一个机会:在一个巨大的市场里,现有的产品没法垄断,就看你能不能把需求切割,创造一个能垄断市场的产品出来。

创业公司增长范式的四阶段

创业从战略上来讲是追求不确定性的机会,但是从战术上来讲要追求高度的确定性,否则你就会死。

最好这样去解决需求

一、它原本就有非常大的问题、非常大的劣迹;
二、这个需求有非常大的供给没有被满足;
三、它本来有非常高的成本,有非常高的链条,或者有非常高的不对称性。解决这样的需求,你将来的发展空间才会够大,你将来的成就也会更大。

创业过程中思考方向和商业模式远远大于执行

在创业过程中,花时间去思考整个方向和商业模式的重要度,远远大于执行。你可能还是在执行上花更多时间,毕竟在早期创业的时候事情多而杂。但是无论你有多忙,一定要花时间去思考战略和方向,而且要培养出自己的思考模式。同样,并不是说执行力不重要,执行力也是战略的一部分。

火车头战略三步曲(创业三步曲)

定战略第一步是寻找方向,也叫预测,第二步是找到关键的破局点,第三步就是all in,把资源围绕着它展开。

预测就是找到大风口,做快乐的猪。

创业者要怎么预测呢?

第一是穿过未来看现在。你站到一个更高的地方,找到一条正确的路的时候,怎么走它都是正确的。路选错了,就算全力以赴、累得要死都不行。

第二是现象即规律。当你看到一件事情很不一样的时候,一定不要觉得这也没什么了不起,那也没什么了不起。滴滴打车发展得这么快,你心理上会想凭什么,但是要马上按住这种想法,去承认滴滴很牛,去思考为什么滴滴能做到?O2O为什么成长这么快?这对我们意味着什么?在这里面我能找到什么样的机会?等等。

第三是侦察兵模式,也就是试错。派出些侦察兵,用资源换机会。在早期的时候你的资源不够多,怎么办?对早期创业者,最核心的资源就是时间资源,就是快速试错,加快迭代的周期。小步快跑的核心是什么?它本质上就是不断打怪。创业就是一个不断打怪的过程,如果你一年才发布产品,别人出手早已经升了很多级了,你一出招就被别人砍死了,连一点机会都没有。等你的公司达到一定规模的时候,你就要派侦察兵,在一些方向上做一些小组化的尝试。尝试的第一个要求是快,第二是简单,第三是自己不要花太多的时间,最后直接看结果。

寻找颇具点

但是光有预测是不够的,未来学家也未必能创业成功。当你找到了方向后,你要怎么切进去很重要。“切”这个字很好,不是排山倒海进去,排山倒海是进不去的,或者说你没有排山倒海的资源进去。所以预测完了之后就要寻找破局点,就是在这个方向上找到那一个点,那个点非常关键。

在你没有突进的点的时候,你跟其他平庸的公司是一样的,没有机会赢。

有一个非常经典的案例,就是微信红包。腾讯以前有3000万的支付用户,就是打不动阿里巴巴的支付宝。后来出了一个微信红包,现在微信支付和支付宝日均访问量已经差不太多了,在2015年除夕那天晚上的峰值已经超过了阿里巴巴双十一的峰值。后来,支付宝为了对抗微信红包,动用了多少资源,花了多少钱,找了多少合作伙伴,依然阻挡不住这个极简破局点再次的冲击。微信红包打钱的那个界面几乎就没怎么改过,它就是极简的方式,非常好用。 这个破局点有多重要呢?这个破局点跟预测一样重要,从创业者的角度来说,这个点就是你的生死存亡之点。找不到这样的点,你就不可能切进去。但是破局点一定要配合大方向,否则切进去里面都是空的,是没意义的,一定要配合预测。

all in

找到破局点之后就是all in,不要有任何犹豫,应该把所有的资源尤其是你自己的资源放在这个破局点上,想尽所有的办法,一直努力到无能为力。

最后,再引用李开复博士在书中后记的内容:伟大的垄断者要做成的三件事:第一、引领公司的文化和使命;第二、汇集顶尖人才;第三、让自己变得更强大。这三件事不可以授权给团队做,是创始人自己必须要做的事。就不在这里继续展开描述了,此篇读书笔记仅作为日后学习回顾使用,推荐本书《创业就是要细分垄断》(作者: 李开复 汪华 傅盛)

]]>
90
Fiddler抓包工具入门及常用功能详解 https://www.87testing.com/2018/05/18/fiddler%e6%8a%93%e5%8c%85%e5%b7%a5%e5%85%b7%e5%85%a5%e9%97%a8%e5%8f%8a%e5%b8%b8%e7%94%a8%e5%8a%9f%e8%83%bd%e8%af%a6%e8%a7%a3/ Fri, 18 May 2018 03:37:33 +0000 https://www.87testing.com/?p=88
先来看一个小故事:

小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问题,页面展示异常”;
小A说:“这哪是我的问题,你去找后台吧,后台接口返回数据有问题”;
小T就屁颠屁颠的跑到后台接口开发小M那里说:“你接口返回数据有问题,改下吧”;
小M看了看服务器日志说:“没找到报错啊,我这里服务正常,你抓个包看下吧”;
小T郁闷了,屁颠屁颠的回去了想:“抓包?抓啥包?”;

以上故事,在实在的测试工作中应该会有不少初入职场的测试人员遇到,公众号中应该有不少刚入职场的测试人员,如果你对fiddler抓包还不熟悉,那么接下来这篇文章可能对你有所帮助,废话不多说,下面开始介绍:

目录

一、HTTP协议简介
二、Fiddler简介
三、Fiddler工作原理
四、Fiddler界面介绍
五、Fiddler抓取HTTPS请求配置
六、Fiddler自带方便的编码工具:TextWizard
七、接口测试
八、设置断点,篡改和伪造数据
九、修改电脑系统hosts
十、HTTP请求统计视图
十一、简单并发测试
十二、慢网络测试(限制网速)
十三、显示出服务器IP方法
十四、命令行QuickExec用法

一、HTTP协议简介

HTTP是超文本传输协议,信息是明文传输的,而HTTPS是安全超文本传输协议,需要证书和提供安全连接,换句话说,HTTPS是嵌套了SSL加密的HTTP连接,其内容由SSL先加密,然后再传输。

简单来讲,HTTPS是加过密的HTTP。由于网络上传输的数据是加密的,用户在浏览网页时,除了用户自己可以看到当前在看什么网页,其他第三方是无法得知用户在做什么的。比如用户在网上登录或输入其他敏感信息进行传输时一旦使用HTTPS,那么数据传输就不是明文了,对于第三方来讲就无法获取你的敏感信息。

二、Fiddler简介

官网:https://www.telerik.com/fiddler
Fiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够设置断点,篡改及伪造Request/Response的数据,修改hosts,限制网速,http请求性能统计,简单并发,接口测试,辅助自动化测试,等等。现在抓包工具成为测试人员的必备使用工具,开发人员也在普遍使用,进行问题的定位分析,是非常有助于工作的一款工具。

三、Fiddler工作原理

先来看看fiddler未参与时,一个普通的客户端与服务端的请求流程图:浏览器访问一个网站:87testing.com,浏览器给webserver发送一个Request,webserver接收到Request后进行处理,返回给浏览器Response,然后浏览器解析Response中的html,展现网页给用户。如图:

Fiddler工作于七层中的应用层,在client与webserver之间以代理服务器的形式存在,启动fiddler后会监听本地127.0.0.1的8888端口(默认端口),IE/Chrome浏览器会自动设置局域网代理(Firefox代理是独立的,需要单独设置),如图:

此时,fiddler就作为代理服务器,浏览器访问87testing.com的流程:浏览器给webserver发送一个Request,代理服务器fiddler接收到Request,fiddler将Request发送到webserver,webserver接收到Request后进行处理,Response到代理服务器fiddler,Fiddler将Response返回到浏览器,如图:

四、Fiddler界面介绍

五、Fiddler抓取HTTPS请求配置

由于fiddler安装后默认只能抓取http请求,如果需要抓取https请求需要进行配置。配置方式:
Tools—>Options—>HTTPS,勾选CaptureHTTPS CONNECTs、Decrypt HTTPS traffic 、ignore server certificate errors(unsafe),点击OK,会弹出证书直接确认即可。

此时,在电脑chrome浏览器上就可以访问https的请求了,且fiddler会话列表上就可以显示出https请求。
在配置移动端证书之前检查下如下配置,Tools—->Connections—->勾选Allow remote computers to connect:

实际工作中,移动端项目大部分会在真机上进行测试,那么下面介绍针对手机端访问http/https请求在电脑端可以抓取到对应手机端发出的请求。iOS设备及Android设备设置方式基本类似,下面以iphone设置为例:
在手机上设置代理:设置—>无线网络,设置服务器ip和端口号:

然后手机safari浏览器输入地址:电脑ip:8888如:http://172.21.10.42:8888会出现如下页面:

点击“FiddlerRoot certificate”进行证书安装,安装完成后,如下说明安装成功:

此时,证书还不算完成安装完,假如手机是ios10.0以上系统,需要在手机系统设置—关于手机—-证书信任设置,在此页面把证书开启即可,此时手机safari浏览器地址栏输入:87testing.com,进行访问,在电脑端fiddler上即可显示出对应的请求:

六、Fiddler自带方便的编码工具:TextWizard

这个自带编码工具就不过多解释了,直接看截图:

七、接口测试

接口测试工具有不少,比如postman、soapui、jmeter等等,那么平时在测试的时候一般都会抓包,那么有可能开发会说帮忙再重现一下,那么又要重新造数据,太麻烦,此时就可以把这个接口保留下来,重新点下Execute即可调用。(根据实际情况可修改请求数据),如下:

点击Execute,在会话列表中会新产生一条请求:

八、设置断点,篡改和伪造数据

设置断点,篡改和伪造数据,在测试中使用的也较平凡,给大家举个我之前写过一篇文章《互联网产品接入第三方支付功能应如何测试?》中也提到过的一个真实的案例:比如使用支付宝购买虚拟商品,往支付宝跳转时,篡改了小的金额,结果购买虚拟商品成功了。(原本10元的商品,0.01元就搞定了)。多么可怕的一个bug啊,当然这个问题可能对于一个做过支付有过经验的测试朋友来说,可能会想:哎呀,这个问题都发现不了,还做什么测试?是的,问题是很简单,对于一个刚入职场的测试朋友或者没有支付相关经验的测试朋友来说,很有可能会忽略。

前面讲过fiddler作为代理服务器时的请求流程图,请求时,可被篡改的两个点:Before Requests、After Responses。

修改Requests方法:Rules—->Automatic Breakpoints—->Before Requests
以论坛发布帖子为例,修改请求前数据内容,比如发布的内容如下:

点击发布帖子,此时请求被fiddler拦截掉,将右侧requests body里面的字段message内容前新增内容:“篡改requests数据成功!”,然后点击Run to Completion,先关闭掉拦截Rules—->Automatic Breakpoints—->Disabled,其他请求都放过,点击工具栏中的“Go”

论坛中查看到刚刚发布的帖子内容如下,就被成功篡改了requests

还有一种方式在命令行中中断某一个域名的方式,如中断www.87testing.com,在命令行输入命令:bpu www.87testing.com,这样就可以拦截www.87testing.com的请求了,取消拦截输入命令:bpu
修改Responses方法:Rules—->Automatic Breakpoints—->After Responses,方法跟修改Requests类似,无非修改的内容变成了Response。

九、修改电脑系统hosts

作为前端工程师现在使用绑定hosts在本地开发调试的场景也越来越多,另外,当预发环境和生产环境共用同一个域名时,通过绑定hosts的方式将访问的域名原本指向生产服务器,强制指向预发服务器上。举个例子,假如我要将www.baidu.com指向87testing.com对应的服务器上,87testing.com对应的服务器公网ip:47.94.18.31,配置如下:Tools—->Hosts—->勾选Enable remapping of requests for one host to a different host or IP,overriding DNS.然后host编辑区域,输入需要域名需要指向的服务器公网IP,比如我将www.baidu.com域名指向了47.94.18.31,保存即可。(如果不使用host,勾去掉即可)

此时,电脑浏览器访问:www.baidu.com,结果打开的内容如下:

同时,抓包看到的结果如下:

十、HTTP请求统计视图

页面请求时间的统计,比较详细,如果要看整个页面从请求,到最后一个请求结束的整体时间,也可以在会话列表中,ctrl+点击需要统计的请求,右边Statistics可以看到总体明细。

十一、简单并发测试

在测试中,这样的场景也非常多,比如被测平台可以有多种货币,有可能从一种货币可以直接兑换成另一种平台货币,在兑换的时候,要多关注下两点安全:数据篡改及并发情况,数据篡改要测试扣减A货币时,篡改金额为负值或金额变少,那么兑换到B货币的数据校验,这个有点类似支付拿少的钱买多的东西,这里就不过多描述了。另外,并发情况,再比如经常会有一些活动相关的测试,假如抽奖活动,一般都有限制一个人一天只能抽一次,那么抽奖的时候同一个用户并发,会不会领取多次奖励。当然最好还是要有正规的压测,或者在测试中可以借助fiddler做一个简单的并发测试,都是很有必要的。
一个人一天只能有一次抽奖机会,那么在点击抽奖按钮发出请求之前,要设置Before Requests Breakpoints,点击抽奖后在会话列表中会看到一个被断点的请求,此时鼠标选中此请求,按shift+u,会弹出并发次数的设置,如下,设置并发次数5次(下面演示截图是发布帖子并发时的截图,可参考)

点击ok,次数会话列表就多出5个请求,如下:

此时,点击工具栏“GO”,六个请求同时发到对应的服务端,即可形成6个并发请求,再看看发表帖子的情况如下:

十二、慢网络测试(限制网速)

1、Fiddler—》Rules—》Customize Rules ,

2、在CustomRules.js里搜索找到:m_SimulateModem,

3、在如下脚本中修改上传及下载延时毫秒数即可:

if (m_SimulateModem) {

        // Delay sends by 300ms per KB uploaded.

        oSession["request-trickle-delay"] = "300"; 

        // Delay receives by 150ms per KB downloaded.

        oSession["response-trickle-delay"] = "150"; 

    }

修改完成后,重启下fiddler,Rules—->Performance—->Simulate Modem Speeds,选中即可生效。

十三、显示出服务器IP方法

Fiddler默认配置中是看不到服务器IP的,接下来简单介绍下在fiddler上也能够看到请求的服务器IP:

1、Fiddler—》Rules—》Customize Rules ,

2、在CustomRules.js里搜索找到:static function Main() ,

3、添加如下一行脚本:

FiddlerObject.UI.lvSessions.AddBoundColumn(“Server IP”, 120, “X-HostIP”);`

完整js代码如下:
static function Main() {  

var today: Date = new Date();  

FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today;  

// Uncomment to add a "Server" column containing the response "Server" header, if present  

FiddlerObject.UI.lvSessions.AddBoundColumn("Server IP", 120, "X-HostIP");  

}

添加完成后,重启下fiddler,就可以显示出请求的服务器ip。

十四、命令行QuickExec用法

常用命令:

help—–打开官方QuickExct命令用法帮助

?87testing——选中带有87testing的请求

bpu www.87testing.com——-拦截www.87testing.com域名请求的requests

Bpafter www.87testing.com——拦截www.87testing.com域名请求的responses

参考官方文档:http://docs.telerik.com/fiddler/knowledgebase/quickexec

]]>
88