robotframework-自动化测试-实例10(接口加密)

前情介绍:
接口的安全性一向都是开发过程中比较在意的一件事情。如何测试已经加密后的接口是现在测试开发人员常面对的一个问题。
预习知识:接口加密的测试

测试需求:
测试系统中添加公告的接口,此接口采用了 签名加密的方式(API_KEY+Time)

Inter.png

测试设计:
测试 加密后的接口的方法其实和一般的接口测试是一致的。只是多了一步对传输的数据进行加密的过程。

用扩展库的方式来完成数据的加密。(扩展库的方式详情-TBD,简单的来说就是你可以自己写Python文件,然后RF可以直接调用你所写的Python文件)

Python中有很多库都可以完成md5加密的功能,此次选取的是hashlib库(提前自行安装:pip install hashlib)

1.png

上图中就是对sign_str进行一个md5加密的形式,md5加密是不可逆的,也就是说当你得到6648e929329e53e7a91c50ae685a88b5那一串东西的时候,你并不知道反编译回来可以是@signpassword, BUT,你可以猜测啊,如果你猜它的md5原值就是@signpassword,最后你拿到加密后的值为6648e929329e53e7a91c50ae685a88b5,Bingo,恭喜你猜对了。所以呢,md5严格意义上来说是一种对称加密的算法,不算特别安全,不过这里为了让大家初步了解接口加密测试的方式,我们就从这里开始学习啦~~~

测试实现:
1 编写一个md5Enc.py文件,里面包含两个函数

  • get_sign 用来处理接口的签名加密
  • get_time_Stamp 用来处理把字符串模式的时间转换为时间戳(这里是一个坑,因为RF中的get time本身得出来的时间是类似2017-07-24 11:47:20 格式的,而 此接口需要的time是时间戳格式)
    2 RF中新建一个项目,在TestSuite层级上导入上面的md5Enc.py文件作为扩展库(记得.py的后缀名需要加上的)
md5Enc_Lib.png

2 编写一个返回值为200的正向接口测试的Testcase

addEvent_Sign.png

第一行:获取当前时间,赋值给变量t_now。
第二行:调用扩展库中的get_time_Stamp函数,将字符串格式的时间转换成时间戳,赋值给变量t_now_stamp
第三行:打印出来看看值是否正常,主要用于调试
第四行:调用扩展库中的get_sign函数,将API_KEY+time的值进行md5加密
第五行:对报头content-Type赋值后构建为一个字典赋值给变量headers
第六行:将一个常量的时间赋值给变量start_time_str
第七行:将POST需要传输的数据构造成字典对象赋值给变量payload
第八行:将payload中的sign取出来查看(为了调试,不必要)
第九行:建立一个Session开始准备发送请求
第十行:发送Post请求,所带参数为之前所构造好的参数
第十一行:对请求返回的status code进行断言,正常应为200
第十二行:打印返回的值的json格式的内容
第十三行:将返回的json格式值赋值给dict
第十四行到第十九行:对返回的值依据之前的接口定义文档来进行断言

附代码(Robot TestCase)

*** Settings ***
Documentation     A robot file to test the CryptAPI
Library           RequestsLibrary
Library           Collections
Library           OperatingSystem
Library           md5Enc.py
Library           Signtest.py

*** Test Cases ***
AddEvent_Sign
    ${t_now}    get time    NOW    #获取当前时间
    ${t_now_stamp}    get_time_Stamp    ${t_now}
    log    ${t_now_stamp}
    ${sign_md5}    get_sign    ${t_now_stamp}    #调用函数
    ${headers}    Create Dictionary    Content-Type=application/x-www-form-urlencoded
    ${start_time_str}    set variable    2017-07-20 12:00:00
    ${payload}    Create Dictionary    eid=13    name=iphone8releasemeeting    limit=2000    address=NewYork    start_time=${start_time_str}
    ...    time=${t_now_stamp}    sign=${sign_md5}
    ${sign_log}    Get From Dictionary    ${payload}    sign
    Create Session    event    http://127.0.0.1:8000/api
    ${r}=    Post Request    event    /sec_add_event/    data=${payload}    headers=${headers}
    Should Be Equal As Strings    ${r.status_code}    200
    log    ${r.json()}
    ${dict}    Set variable    ${r.json()}
    #断言结果
    ${msg}    Get From Dictionary    ${dict}    message
    Should Be Equal    ${msg}    add event success
    ${sta}    Get From Dictionary    ${dict}    status
    ${status}    Evaluate    int(200)
    Should Be Equal    ${sta}    ${status}

Test
    ${message}    add_event_success
    Log    ${message}

md5Enc.py(导入的文件需要和robot的项目在同一个文件夹内)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import hashlib
import json
import time

class md5Enc(object):
    def get_sign(self,t):
        '''
        Examples:
        ${sign_md5}  | Get Sign  |${t_now}
        '''
        keyMd5 = hashlib.md5()
        api_key = "&Guest-Bugmaster"
        sign_str = t + api_key
        sign_bytes_utf8 = sign_str.encode(encoding="utf-8")
        keyMd5.update(sign_bytes_utf8)
        keyMd5 = keyMd5.hexdigest()

        return keyMd5

    def get_time_Stamp(self,t=''):
        timeArray = time.strptime(t, "%Y-%m-%d %H:%M:%S")
        timeStamp = int(time.mktime(timeArray))
        timeStamp_str = str(timeStamp)

        return timeStamp_str
#a=md5Enc.get_sign('sdf','2017-07-20 16:04:30')

CC先生说,扩展库可以说是RF中非常强大的一个功能,如果想对之前的自动化测试代码进行重构,又不想花费太多工夫的情况下,使用RF的扩展库是再方便不过的功能。不过这里有一个坑是,如果你的Class里面的函数是以test开头的可能添加会失败。(不要问我是怎么知道的。。。一个多小时的时间就耗费在这个上面了。。。。)


图片发自简书App
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容