【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】
【领域:测试分析,自动化测试,性能测试,安全测试 】
【个人定位:高级测试工程师+培训师+领域产品专家】
系统级mock脚本
上一篇 /
下一篇 2010-04-17 17:38:38
/ 个人分类:bash
图片空间上传满了。只上传一个图片。
背景
小组内存在测试数据构造困难的问题。前段的web测试,需要依赖后端平台进行测试。
为了配合mock方法的推进,专门开发了mock工具。
采用python+Bash技术。
Mock工具已经开发完成。欢迎大家测试。
用法介绍
使用方法:
执行mock命令
此命令会在本机监听一个端口,默认的端口和被mock的服务端口是一样子的。可以手工指定端口,如果有冲突的话。
会在当前目录中生成2个目录,bin与data。Bin存放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的环境为mock的ip与端口。
第一次查询mp3,mp4,mp5
系统会自动保存对应的数据文件
查询mp3的结果
真实服务器的查询结果与mock程序的结果比对。是一样的。
出于测试的需要,我去修改mp3的结果输出。直接去mock的data目录下修改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协议的服务mock。Mock后台服务以及其他的接口。实现数据的干预与输出结果自定义。
理论上经过扩展可以支持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: