发布新日志

  • jmeter 插件二次开发

    2019-10-17 18:06:16

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/cyjs1988/article/details/84938497
    ————————————————
    版权声明:本文为CSDN博主「猎摘互联网软件测试业界技术文章专用博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/cyjs1988/article/details/84938497

    把需要的jar包 添加到maven依赖中

    jmeter中javasample请求需要的jar包

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>MyJmeter</groupId>
        <artifactId>MyJmeter</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <jmeter.version>3.0</jmeter.version>
        </properties>
        <dependencies>
            <!--jmeter-->
            <dependency>
                <groupId>org.apache.jmeter</groupId>
                <artifactId>ApacheJMeter_core</artifactId>
                <version>${jmeter.version}</version>
            </dependency>
     
            <dependency>
                <groupId>org.apache.jmeter</groupId>
                <artifactId>ApacheJMeter_java</artifactId>
                <version>${jmeter.version}</version>
            </dependency>
        </dependencies>
     
        <build>
            <plugins>
                <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-jar-plugin</artifactId>-->
                <!--<version>2.4</version>-->
                <!--<configuration>-->
                <!--<archive>-->
                <!--<manifest>-->
                <!--<addClasspath>true</addClasspath>-->
                <!--<classpathPrefix>lib/</classpathPrefix>-->
                <!--<mainClass>etms.TestEtms</mainClass>-->
                <!--</manifest>-->
                <!--</archive>-->
                <!--</configuration>-->
                <!--</plugin>-->
                <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-dependency-plugin</artifactId>-->
                <!--<executions>-->
                <!--<execution>-->
     
                <!--<phase>package</phase>-->
                <!--<goals>-->
                <!--<goal>copy-dependencies</goal>-->
                <!--</goals>-->
                <!--<configuration>-->
                <!--<outputDirectory>-->
                <!--${project.build.directory}/lib-->
                <!--</outputDirectory>-->
                <!--</configuration>-->
                <!--</execution>-->
                <!--</executions>-->
                <!--</plugin>-->
     
            </plugins>
        </build>
     
    </project>

    然后编写代码如下
    package com.niu.MyJmeter;
     
    import javafx.scene.shape.ArcTo;
    import org.apache.jmeter.config.Arguments;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;
    import org.apache.xmlbeans.impl.xb.xsdschema.impl.PublicImpl;
     
    /**
     * Created by Administrator on 2017/8/30 0030.
     */
    public class JmeterTest implements JavaSamplerClient {
        private String interfaceName;
        private String methodName;
     
        @Override
        public void setupTest(JavaSamplerContext javaSamplerContext) {
            //某种连接只连接一次,例如数据库
            System.out.print("测试开始");
     
        }
     
        @Override
        public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
            SampleResult result = new SampleResult();
            //获取页面上interfaceName的方法
            interfaceName = javaSamplerContext.getParameter("interfaceName");
            //获取页面上methodName的方法
            methodName = javaSamplerContext.getParameter("methodName");
            //测试开始的时间戳
            result.sampleStart();
            //设置响应数据的格式
            result.setResponseData(interfaceName+":"+methodName,"UTF-8");
            //测试结束的时间戳
            result.sampleEnd();
            //设置成功的
            result.setSuccessful(true);
            //设置响应code码
            result.setResponseCodeOK();
            //设置数据编码格式
            result.setDataEncoding("UTF-8");
            return result;
        }
     
        @Override
        public void teardownTest(JavaSamplerContext javaSamplerContext) {
            System.out.print("测试结束");
        }
     
        @Override
        public Arguments getDefaultParameters() {
            //添加参数
            Arguments arguments = new Arguments();
            arguments.addArgument("interfaceName","");
            arguments.addArgument("methodName","");
            return arguments;
        }
     
        public static void main(String[] args){
            JmeterTest jmeterTest = new JmeterTest();
            JavaSamplerContext arg0 = new JavaSamplerContext(jmeterTest.getDefaultParameters());
            jmeterTest.runTest(arg0);
            jmeterTest.teardownTest(arg0);
        }
    }

    然后用IDEA中的clean 先清除包,再install打成jar包,放到jmeter中的javasample中,本次代码中的参数是interfaceName, methodName ,然后面填入值,就可以用查看结果树来查看响应结果。

  • Jmeter 测试 Dubbo 接口脚本编写

    2018-06-27 18:01:23

    Jmeter 测试 Dubbo 接口脚本编写


    https://testerhome.com/topics/9980



    Dubbo接口测试方法及步骤


    https://jingyan.baidu.com/album/d169e1867ef77c436611d804.html
  • 接口测试返回值成功,数据库值错误

    2016-12-22 15:51:53








    明明返回Success, 结果数据库里的姓名不是Post的姓名,开发说是缓存的问题,修改缓存的代码后, 正常

    查看(3232) 评论(0) 收藏 分享 管理

  • 使用python进行接口测试(二)

    2016-12-05 18:27:16

    转自
    www.cnblogs.com/hainan-zhang/p/5889341.html

    之前使用过urllib和urllib2做接口测试,在做的途中,感觉使用urllib2直接进行的get,post 请求并没有那么好用。作为测试人员,所需要的测试工具应当以方便为第一要务,测试的耗时只要是真正的无人值守,耗时不是太久的都可以接受。所以,本人又尝试了一个新的包:requests。  

      Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 !推荐一篇文章,上面有该包的详细说明 传送门,以下只会写到我用到的部分,所以更多的了解需要自己去搜资料

       好了,我们开始吧!!

      接口测试中重要的部分:

           1.get和post方法

         2.用到的参数

         3.请求头

         4.cookie

         5.日志输出

         6.如何调试你的程序--借助fiddler

      按照以上的顺序,我将一一说明我的搞法,因为编码能力有限,所以可能看着很low

    一、get和post

      requests包很好的实现了post和get方法,示例:

    1 import requests
    2 response_get = requests.get(url, data, headers, cookies)
    3 response_post = requests.post(url, data, headers, cookies)

      其他的访问方式如put,head等等,用法几乎都是如此,因为没用到,所以省略

      现在一般的接口返回值有页面和json俩种,按照需求,可以分别使用response.text或者response.content获取,text获取的是unicode类型的返回值,而content返回值是str类型,所以我一般使用content来获取返回值,因为这样获取的返回值可以直接使用正则或者in的方式来验证返回值结果是否正确。

         我自己为了实现接口的自动访问,所以又在requests上面加了一层封装,就像下面这样:

    复制代码
     1 def main_get(list_result, cookies):
     2     """
     3     用于模拟get请求,返回结果
     4     :param list_result:空列表,用于存储结果
     5     :param cookies: 登陆后的cookie
     6     :return:访问结果
     7     """
     8     # List_interface_get写在接口文件里,文件是py格式,然而它本身是字典类型
     9     for key in List_interface_get:
    10         try:
    11             f1 = requests.get(key, cookies=cookies)
    12             if f1:
    13                 print f1.content
    14                 print List_interface_get[key]+'接口访问成功'
    15                 split_line()
    16             list_result.append(f1.content+'||'+key)
    17             # print f1.read()
    18         except AssertionError:
    19             print 'One Error in get'
    20             pass
    21     return list_result
    22 
    23 
    24 def main_post(result_list, url_list, param_list, payload_list, note_list, cookies):
    25     """
    26     模拟post请求
    27     :param result_list: 结果字典
    28     :param url_list: 接口字典
    29     :param param_list: 入参字典
    30     :param payload_list: header字典
    31     :param notelist: 描述字典
    32     :param cookies: 登录获取的cookie
    33     :return:填充完成的结果列表
    34     """
    35 
    36     # post这块写的比较low,最好自己搞一个数据结构把它搞定
    37     for key in range(1, 9):
    38         a = requests.post(url=url_list[key], data=param_list[key], headers=payload_list[key], cookies=cookies)
    39         try:
    40             if a.content:
    41                 print a.content
    42                 print note_list[key]+'接口访问成功'
    43                 split_line()
    44             result_list.append(a.content+'||'+url_list[key])
    45         except AssertionError:
    46             print 'One Error in post'
    47             pass
    48     return result_list
    复制代码

     

    二、用到的参数以及请求头

      我用的方法是把这些都存放于一个py文件中,当然也可以使用excel或者xml文件,甚至于使用DB。项目紧急,凑合了一下,这里的数据结构主要为了符合上面封装的函数,直接上代码看吧

    复制代码
     1 BaseURL = 'https://******.com'  # 测试环境
     2 # 使用什么数据结构不重要,关键看实现方法中怎么解析你的测试数据
     3 List_interface_get = {
     4     BaseURL+'/api/****/****/****?****=1&****=375': '描述'
     5 }
     6 # 以下是用于post的接口
     7 List_interface_post = {
     8     1: BaseURL+'/api/****/****/****/****'
     9 }
    10 # 以下是用于post的数据
    11 List_post_param = {
    12     1: 'new=222222&old=111111'
    13 }
    14 # 以下是post接口的描述,它是干嘛的
    15 List_post_note = {
    16     1: '修改密码'
    17 }
    18 # 以下是post用到的请求头
    19 List_post_header= {
    20     1: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
    21 }
    复制代码

     

      三、cookie

      一款产品的接口测试中必定会使用登录状态,需要使用cookie实现,之前写过使用cookiejar获取cookie,requests中获取cookie的方法更为简单,不过首先你得知道是哪个接口set了cookie,不过一般是登录啦。登录接口访问之后set了cookie,那好,就去调用登录接口,然后拿到搞回来的cookie:

    # 只需要这样!!
    login = requests.post(login_url, data=login_data, headers=login_header)
    cookie = login.cookies

    这个cookie就是登录状态了,拿着随便用,需要登录的就直接cookies=cookies

         四、日志输出

      这里注意看第二步中接口数据,有接口描述,也有接口是啥,第一步中又把content做成返回值了,具体拼接方式自己想吧,东西全有了,想写啥写啥,还可以加上获取本地时间的api获取接口运行时间,log文件该长啥样是门学问,这里就不献丑了。

       五、借用fiddler调试你的脚本

         requests允许使用代理访问,这有啥用,真有!fiddler是一款截包改包的工具,而且通过扩展可以进行请求间的比对,这样让你的程序访问的请求和真正正确的请求作对比,为啥我的程序访问出错?是不是缺了请求头?参数是不是丢了?cookie是不是少了?很容易看出来。写法如下:

    proxies = {
         "http": "http://127.0.0.1:8888",
         "https": "http://127.0.0.1:8888"
    }
    requests.post(url, proxies=proxies)

    这样就可以走代理了,除fiddler以外还有charles和burp suite可以使用,具体看个人喜好吧。

     

     


  • 使用python进行接口测试--Cookie的使用

    2016-12-05 18:22:58

    转自

    http://www.cnblogs.com/hainan-zhang/p/5320153.html

    最近在做接口测试,之前公司的方案是使用postman进行接口测试。但是伟大的墙导致我们只能用离线版postman。。然后一个很长很长的接口列表,一个接一个的访问。我的天哪。。所以萌生了一个想法,使用python编写一套接口测试脚本,设置接口列表,然后逐条访问,输出日志。

      第一个坑:POST 和 GET----GET一般用于获取/查询资源信息,而POST一般用于更新资源信息|Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。

    做过接口测试或者做过前端的人都知道,接口的访问方式是不一致的,所以才会使用postman来进行接口测试,因为它可以设置post和get方式。使用python模拟这俩种访问方式是重中之重。先说GET方式。GET方式就比较简单了,把接口放进浏览器地址栏,点下回车就完成了一次GET。所以就需要使用python访问URL就可以模拟一次GET 测试。

    复制代码
    1 import urllib2
    2 url_save = 'http://www.baidu.com/'
    3 try:
    4     s_save = urllib2.urlopen(url_save).read()
    5     print s_save  
    6 except urllib2.HTTPError, e:
    7     print e.code
    8 except urllib2.URLError, e:
    9     print str(e)
    复制代码

    如上所示就完成了一次GET请求,调用urllib2库,然后将一个字符串形式的URL传给urllib2.urlopen函数,最后使用read()方法将GET回来的数据存储起来。

    然后说说POST。其实在python的urllib2库中,我们刚刚所使用的urlopen函数还有其他几样不是必选的入参,因为这些入参给定了初始化的值:

    1 def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
    2             cafile=None, capath=None, cadefault=False, context=None):

     

    如上代码,urllib库有一个很智能的毛病。data不给值,访问方式就是GET,data给了值,方式就会变成POST;所以模拟POST 方式的代码如下:

    复制代码
    import urllib 
    import urllib2 
    url = 'http://www.example.com' 
    # values的形式:name:value
    values = {'**' : '***', 
              '**' : '***', 
              '**' : '***' } 
    #使用urllib.urlencode函数对values字典进行处理,最终形式为:**=***&**=***
    data = urllib.urlencode(values) 
    #如果对data顺序有要求,建议自己拼接data
    req = urllib2.Request(url, data) 
    response = urllib2.urlopen(req) 
    the_page = response.read()
    复制代码

    就像如上代码,把POST方式所需要的数据写到data参数中去,POST方式就模拟成功了。

      第二个坑:cookie的使用

    使用python获取cookie所需要的库叫做cookielib。获取cookie的例子:

    复制代码
     1 # 这里有四种CookieJar,CookieJar是最原始的
     2 cookie_use = cookielib.CookieJar()
     3 handler = urllib2.HTTPCookieProcessor(cookie_use)
     4 # 使用绑定好CookieJar的handler创建一个opener
     5 pener = urllib2.build_opener(handler)
     6 # 将opener安装到urllib2中
     7 urllib2.install_opener(opener)
     8 # 使用安装好的urllib2访问某一网站获取cookie
     9 urllib2.urlopen('https://....../login')
    10 #这个时候cookie已经被CookieJar获取到了
    11 print cookie_use
    复制代码

    在下一步,将获取到的cookie绑定到opener头中:

    1 '''
    2  将获取到的cookie绑定到opener,上一步获取的cookie并不满足如下格式,
    3  需要自己进行字符串的切片和拼接 
    4 '''
    5 opener.addheaders.append(('Cookie', 'name=***&888=888'))

    现在的opener就可以用来访问任意需要登录的网站了!

     

                 
  • 用python实现接口测试(一 、请求api)

    2016-12-05 17:47:53

    转自:

    http://www.tuicool.com/articles/fyayueV



    用python来做接口测试,可以通过学习urllib和urlllib2这两个库来实现,下面以 豆瓣图书的用户收藏信息api 来举例说明一下。

    看一下这个接口的相关信息,如下:

    我们可以把:name换成豆瓣老大阿北的用户名,即https://api.douban.com/v2/book/user/ahbei/collections,来看看阿北平时喜欢看什么书。下面分别用post和get两种方式请求api,附上代码注释。

    1.用post方法请求api:这种方式把参数放在请求内容中传递,比较安全

    #-coding:UTF8-*-
    
    import urllib2,urllib     # 把这两个库导入
    
    url = 'https://api.douban.com/v2/book/user/ahbei/collections'  # 这是要请求的url
    
    data={'status':'read','rating':3,'tag':'小说'}  # 根据api文档提供的参数,我们来获取一下阿北读过的书中,他标记了‘小说’这个标签的三星书籍,把这些参数值存在一个dict里
    
    data = urllib.urlencode(data) # 把参数进行编码 
    
    url2 = urllib2.Request(url,data) # 用.Request来发送POST请求,指明请求目标是之前定义过的url,请求内容放在data里
    
    response = urllib2.urlopen(url2)  # 用.urlopen打开上一步返回的结果,得到请求后的响应内容
    
    apicontent = response.read()  #将响应内容用read()读取出来
    
    print  apicontent  #打印读取到的内容
    

    运行上面的代码后,返回了下面的结果:

    {"count":20,"start":0,"total":1,"collections":[{"status":"read","rating":{"max":5,"value":"3","min":0},"updated":"2007-02-28 01:33:03","user_id":"1000001","tags":["小说"],"book":{"rating":{"max":10,"numRaters":33631,"average":"7.4","min":0},"subtitle":"","author":["余华"],"pubdate":"2006-3","tags":[{"count":8995,"name":"余华","title":"余华"},{"count":4754,"name":"小说","title":"小说"},{"count":2080,"name":"兄弟","title":"兄弟"},{"count":1931,"name":"中国文学","title":"中国文学"},{"count":1533,"name":"兄弟(下)","title":"兄弟(下)"},{"count":1157,"name":"当代","title":"当代"},{"count":1050,"name":"中国","title":"中国"},{"count":1010,"name":"文革","title":"文革"}],"origin_title":"","image":"http:\/\/img3.douban.com\/mpic\/s9109733.jpg","binding":"平装","translator":[],"catalog":"","pages":"475","images":{"small":"http:\/\/img3.douban.com\/spic\/s9109733.jpg","large":"http:\/\/img3.douban.com\/lpic\/s9109733.jpg","medium":"http:\/\/img3.douban.com\/mpic\/s9109733.jpg"},"alt":"http:\/\/book.douban.com\/subject\/1703544\/","id":"1703544","publisher":"上海文艺出版社","isbn10":"7532129845","isbn13":"9787532129843","title":"兄弟(下)","url":"http:\/\/api.douban.com\/v2\/book\/1703544","alt_title":"","author_intro":"余华,浙江海盐人,1960年出生于浙江杭州,后来随父母迁居海盐县。中学毕业后,因父母是医生,余华曾当过牙医,五年后弃医从文,进入县文化馆和嘉兴文联,从此开始文学创作生涯。曾在北京鲁迅文学院与北师大中文系合办的研究生班深造,1984年开始发表小说。余华是中国先锋派小说的代表人物,与叶兆言、苏童等人齐名。作品有短篇小说集《十八岁出门远行》、《世事如烟》,和长篇小说《活着》、《在细雨中呼喊》及《战栗》。","summary":"宋钢在下部里面遭遇的命运是他所在的工厂破产,他也越来越潦倒,后来因为各种各样复杂的原因,他在40多岁时**了。他**时,林红和李光头正在同一张床上。宋钢在临死之前,给林红和李光头都写了一封信。\n林红是一个典型的连接今天和过去的女性,不同于80年代以后出生的女性。宋钢的死,让她在生意场上变得像以前的李光头一样很成功,而李光头则变得没有了任何**,挣钱没有了任何兴趣,唯一的愿望就是,上太空,把哥哥的骨灰盒拿到太空去。\n在尾声里,余华交代了李光头的命运。“他要上太空去。他还专门请了两个俄罗斯留学生教他俄语,还进行体能锻炼。因为李光头在电视里看到,在太空的轨道上,每天可以看16次日出和16次日落。李光头要把宋钢的骨灰盒放在,太空的轨道上,让宋钢遨游在月亮和星星之间,最后,李光头用俄语说:‘我的兄弟宋钢就是外星人了’。”","series":{"id":"15299","title":"兄弟"},"price":"27.00元"},"book_id":"1703544","id":11128591}]}
    

    所以可以知道,阿北读过的书中,他标记了‘小说’这个标签的三星书籍只有1本( total=1 ),就是余华的《兄弟》

    2.用get方法请求api:这种方式把参数放在直接放在url中

    import urllib2,urllib
    
    url = 'https://api.douban.com/v2/book/user/ahbei/collections'  
    
    data={'status':'read','rating':3,'tag':'小说'}
    
    data = urllib.urlencode(data)
    
    url2 = url + '?' + data   
    # 跟post不同的只有这一句,使用?把url和data的内容连接起来,结果是https://api.douban.com/v2/book/user/ahbei/collections?status=read&rating=3&tag=%E5%B0%8F%E8%AF%B4
    
    response = urllib2.urlopen(url2)
    
    apicontent = response.read()
    
    print  apicontent
    

    运行之后,得到跟POST一样的结果

Open Toolbar