zoukankan      html  css  js  c++  java
  • Python+Excel+Unittest+HTMLTestRunner实现数据驱动接口自动化测试(一)

    整个流程:

    使用HTMLTestRunner的Run方法执行用例,用例调用Excel读取方法,将测试数据导入到unittest用例中执行,测试结果返回给HTMLTestRunner。

    因为刚接触接口自动化,写的比较简单。后面也会考虑加一个请求类型的封装,excel测试数据也会增加一些字段(如用例是否运行,是否带Headers、cookie,

    case依赖,关联数据库,增加日志,定制化HTML,测试结果自动发送邮件等),搞完后再分享出来。

    整个目录结构:

    ---common 存放公共库

    ---testcase 

    ---testdata 存放excel测试数据

    ---testreport 存放测试报告

    ---Run_tests 启动测试

    1. Run_tests.py

    使用discover方法构造测试集,用HTMLTestRunner的run()方法启动测试集并生成测试报告。

    import time, sys
    sys.path.append('./testcase')
    sys.path.append('./common')
    from HTMLTestRunner import HTMLTestRunner
    from unittest import defaultTestLoader
    
    
    
    # 指定测试用例为当前文件夹下的 testcase 目录
    test_dir = './testcase'
    testsuit = defaultTestLoader.discover(test_dir, pattern='*_test.py')
    
    
    if __name__ == "__main__":
    
        now = time.strftime("%Y-%m-%d %H_%M_%S")
        filename = './testreport/' + now + '_result.html'
        fp = open(filename, 'wb')
        runner = HTMLTestRunner(stream=fp,
                                title='System Interface Auto Test Report',
                                description='Test Result')
        runner.run(testsuit)
        fp.close()
    

      

    2. 测试Excel档如下:

    使用公共库中的OperateExcel方法读取,通过excel名和sheet名返回测试数据的列表集合。

    def Readexcelrow_of_sheet(filename,sheet_name,row):
        '''返回某个sheet中某一行数据的列表'''
        folder = "C:\Users\LENOVO\PycharmProjects\Apiautotest-master\testdata\"
        fullfilename = folder + filename
        rb = xlrd.open_workbook(fullfilename)
        sheet = rb.sheet_by_name(sheet_name)
        datalist = []
        for i in range(8):
            try:
                data = sheet.cell_value(row,i)
                datalist.append(data)
            except TypeError as f:
                break
        #print (datalist)
        return datalist
    
    def Readexcelalldata_of_sheet(filename,sheet_name):
        '''返回整个sheet的内容的列表'''
        datalistlist =[]
        for i in range(1,100):
            try:
                data = Readexcelrow_of_sheet(filename,sheet_name,i)
                datalistlist.append(data)
            except IndexError as e:
                break
        return datalistlist
    

      

    3. testcase调用该方法读取测试数据后,取出测试数据循环进行request测试,对测试结果进行断言

        def test_login(self):
            self.testcasecount = len(self.testcaseinfo)
            for i in range(len(self.testcaseinfo)):
                data = self.testcaseinfo[i]
                #print (data)
                url =     data[3]
                payload = data[4].encode('utf-8')
                expectedcode = data[5]
                expectedmsg =  data[6]
                expecteddata = data[7]
                headers= {"Content-Type": "application/json"}
                r = requests.post(url,data=payload,headers=headers)
                self.result = r.json()
                self.assertEqual(self.result['code'], expectedcode,msg="code断言失败")
                self.assertEqual(self.result['msg'], expectedmsg,msg="msg断言失败")
                if expecteddata != "":
                    print ("检查data字段")
                    self.assertEqual(str(self.result['data']), expecteddata,msg="data断言失败")
    

     

    4.测试完成后生成测试报告,报告中可以体现出测试异常的原因。

    目前还有个问题:

    unittest中实际运行了一个借口的很多条用例,而报告中只会有一条记录。这是因为unittest test case中我只写了一个test方法,循环测试数据。这样写用例更简单,目前在想是从报告中处理,还是测试用例读取部分进行处理。

    有想法欢迎给我留言,谢谢。

     

  • 相关阅读:
    搭建一个免费的,无限流量的Bloggithub Pages和Jekyll入门
    通过扩展方法 链式方法 为MVC 3 视图添加验证
    让移动UI模式设计者获得灵感的10个有用的网站资源
    企业级应用架构(NHibernater+Spring.Net+MVC3)_V1.0
    把博客放在Github
    实例化需求—流程
    nginx+keepalievd,实现负载均衡和故障点切换。keepalived双机热备。
    古城钟楼
    从初步使用该控件到多维数据集控件PivotGridControl
    搜索引擎的评价
  • 原文地址:https://www.cnblogs.com/Sandy-1128/p/appium-python-sandy-0314-1.html
Copyright © 2011-2022 走看看