【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

系统级mock脚本

上一篇 / 下一篇  2010-04-17 17:38:38 / 个人分类:bash

图片空间上传满了。只上传一个图片。
 

背景

小组内存在测试数据构造困难的问题。前段的web测试,需要依赖后端平台进行测试。

为了配合mock方法的推进,专门开发了mock工具。

采用python+Bash技术。

 

Mock工具已经开发完成。欢迎大家测试。

 

用法介绍

使用方法:


 

执行mock命令

 

此命令会在本机监听一个端口,默认的端口和被mock的服务端口是一样子的。可以手工指定端口,如果有冲突的话。

会在当前目录中生成2个目录,bindataBin存放mock文件,用于解析。

Dta存放查询的结果数据。还有一个mock.conf文件,保存mock的信息。

 

mock -urlhttp://10.20.146.4:6146/bin/search?sample_en?q= -port 8000

 

url参数为你要mock的请求地址。去掉参数。

 

此时,mock程序会进入一种学习状态。

 

 

你可以在前段查询MP3手机,之类的关键词。如果mock发现之前没有查询过这次关键词,没有这些query的保存结果,就自动去被mock的真正服务上去取数据。然后保存。

如果发现之前查询过,就会取之前的查询结果。你可以在之前的查询结果中修改原来的输出。

 

 

首先搭建好前段的web环境,然后修改sq,或者isearch的环境为mockip与端口。

 

第一次查询mp3mp4mp5


系统会自动保存对应的数据文件


 

查询mp3的结果

 

 

真实服务器的查询结果与mock程序的结果比对。是一样的。

 

 

 

出于测试的需要,我去修改mp3的结果输出。直接去mockdata目录下修改q=mp3文件的内容

 


 

 

 

然后再次查询MP3

 

 

 

 

 

其他高级功能

 

如果是下次想重新使用之前的数据进行mock。直接执行mock就可以了。它会读取默认的配置,启动先前的mock。不需要做初始化工作

 

Mock –url ‘http://10.20.146.4:6146/bin/search?sample_en?q=mp3’ #启动mock

Mock –url ‘http://10.20.146.4:6146/bin/search?sample_en?q=mp3’ –port 8000 #设定端口

Mock –url ‘http://10.20.146.4:6146/bin/search?sample_en?q=mp3’ -data key.data #一次性读取key.data里面的所有关键词,然后自动去被mock服务上去查询,用于预先的学习。

 

 

Mock百度搜索

 

 


 

 

 

Mock google搜索,被google查出来了。看来google的确小心了很多。不过相信通过设置一定的header可以绕过这个限制。

 


 

 

 

 

 

 

应用场景

可以用于基于http协议的服务mockMock后台服务以及其他的接口。实现数据的干预与输出结果自定义。

理论上经过扩展可以支持tcp协议级别的mock

目前可应用于后端的接口测试中。

 


完整的代码





:<<mock_help
Mock -url 'http://10.20.146.4:6146/bin/search?sample_en?q=mp3'
Mock -url 'http://10.20.146.4:6146/bin/search?sample_en?q=mp3' -port 8000
Mock -url 'http://10.20.146.4:6146/bin/search?sample_en?q=mp3' -data  key.data
mock -url http://www.baidu.com/s?wd= -port 8000
mock
mock_help
mock()
{
    local port url  mock_ip mock_port data # service=SimpleHTTPServer
    seven_getopt "$@"   
    [[ -n $url ]] &&
    {
        #service=CGIHTTPServer
        mkdir bin data
        echo '#!/bin/bash
        echo "Content-type: text/html"
        echo
        if [ "$REQUEST_METHOD" = "POST" ]; then
            if [ "$CONTENT_LENGTH" -gt 0 ]; then
                read -n $CONTENT_LENGTH POST_DATA <&0
            fi
        fi
        request_data="$QUERY_STRING$POST_DATA"       
        ' > bin/http.sh
        chmod +x bin/http.sh
        mock_ip=`echo "$url" |awk  -F'//' '{print $2}' |awk -F ':|/' '{print $1}'`
        mock_port=`echo "$url" |awk  -F'/' '{print $3}' |awk -F ':|/' '{if(NF==2) print $NF; else print "80";}'`
        [[ -z $port ]] && port=$mock_port
        bin_dir=`echo "$url" | awk -F '?' '{print $1}' |awk -F/ '{for(i=4;i<NF;i++) printf  $i"/"}'`
        bin_file=`echo "$url" | awk -F '?' '{print $1}' |awk -F/ '{print $NF}'`
        mkdir -p $bin_dir &>/dev/null
        echo -e '#!/bin/bash\n. bin/http.sh;data_file=data/${request_data}_data
            [[ -f $data_file ]] && cat $data_file && exit;
        . mock.conf;
        curl "http://$mock_ip:$mock_port$SCRIPT_NAME?$request_data" 2>/dev/null |tee data/${request_data}_data
        ' > $bin_dir$bin_file
        chmod +x $bin_dir$bin_file       
        echo -e "port=$port\nmock_port=$mock_port\nmock_ip=$mock_ip\nbin_dir=$bin_dir\nbin_file=$bin_file"  |tee mock.conf
    }
    [[ -n $data ]] &&
    {   
        while read line
        do
            curl "$url$line" 2>/dev/null  | tee data/${line}_data
            echo -e "$line===data/${line}_data" >> data/data.conf
        done < $data
    }   
    #python -m $service $port
    [[ -f mock.conf ]] && . mock.conf
    print "Start Listenning , Try visit http://`ip`:$port/$bin_dir$bin_file"
    echo -e "
    \rfrom CGIHTTPServer import CGIHTTPRequestHandler
    \rfrom BaseHTTPServer import HTTPServer
    \rclass Handler(CGIHTTPRequestHandler):
    \r\tcgi_directories = ['/cgi-bin','/bin','$bin_dir','$bin_dir$bin_file']
    \rserver_address=('',$port)
    \rhttpd = HTTPServer(server_address, Handler)
    \rhttpd.serve_forever()
    " |python


}



TAG:

 

评分:0

我来说两句

Open Toolbar