简介
  这一篇主要是将前边的所有知识做一个整合,把各种各样的砖块—模块(post请求,get请求,logging,参数关联,接口封装等等)垒起来,搭建一个房子。并且有很多小伙伴对于接口项目测试的框架一筹莫展,吵吵着什么时候才可以看到一篇相对于比较完整的项目源码,但是由于完整的项目属于公司内部的代码,这个是说句大实话是没法分享的,这个想必大家都知道吧,不知道入职的时候都签过保密协议吧。所以由于种种原因没办法给小伙伴们分享公司内部的项目源码,就算别人分享了,也只适用于本公司内部的业务。你拿过来也不能用的,需要修修补补。所以用例的代码还是得自己去一个个写,这个宏哥只能分享项目框架,自己在框架里添加自己公司的业务测试用例,使她变的丰满充实,适合自己公司的业务。希望对小伙伴们有所指导或者是启发,好了时间不早了,废话少说,还是尽快进入今天的主题吧—接口项目测试结构(框架)设计。

一、项目结构
项目架构设计源码,获取源码下载地址:https://github.com/hongduhong/HongGe_InterfaceTest

1、新建一个工程(一定要创建工程),工程名称自己定义,如:hongge_jiekou

2、在工程的跟目录新建一个脚本:run_main.py,用来执行全部用例

3、在工程下创建以下几个pakage包:

–case:这个包放test开头的测试用例,也可以放一些封装接口的方法,如:login(如果封装的接口比较多,也可以单独放一个包,可以命名为:framework,当然了可以随便但是要见名知义,不要奇葩、不要关键字等等)

–common:这个包放一些公共的方法,如:读取excel文件方法,读取mysql、oracle,logger.py这个是封装日志的输入

–config:cfg.ini这里是配置文件,如邮箱的一些参数:收件人,发件人,密码等,readConfig.py用于读取配置文件

–logs:这里存放日志信息

–report:这里存放测试报告

二、run_main

第一步:用discover方法加载所有的测试用例

1、cur_path这个参数是读取当前这个脚本的真实路径,也就是run_main.py的真实路径

2、caseName="case"这个case是存放测试用例的文件夹,如果没有的话,自动创建。如果想运行其它文件夹的用例,就改下caseName这个参数值

3、rule="test*.py"这个是匹配用例脚本名称的规则,默认匹配test开头的所有用例

第二步:生成HTML报告

1.把上一步加载到用例的参数传入这个函数,测试报告的文件名称默认report文件夹:reportName="report

2.如果没有这个report文件夹也没关系,可以自动创建的

第三步:获取最新的测试报告

1.如果第二步生成的测试报告加了时间戳,想找到最新的文件就用第三步

2.如果第二步不加时间戳,只是生成result.html,那这一步其实没卵用,可以忽略

(个人觉得报告用一个名称result.html就行,新的自动覆盖旧的)

第四步:发送测试报告到邮箱

1、像QQ邮箱这种ssl加密的就走SMTP_SSL,用授权码登录

2、其它邮箱就正常账号密码登录,走SMTP

3、最后执行代码

这里邮箱的内容读的配置文件

三、config配置

1、cfg.ini打开,这里写配置文件内容

2、用readConfig.py读取配置文件


3、读取的内容就是传入第二步操作里面需要调用邮箱的配置信息

四、logger

1、logger.py这个文件放到common目录下,封装日志文件的读取

2、日志保存到logs文件夹


3、参开代码:

 1 # -*- coding:utf-8 -*-2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-5-307 @author: 8 Project:项目结构设计9 '''
10 # 3.导入模块
11 import logging, time
12 import os
13
14 # log_path是存放日志的路径
15 cur_path = os.path.dirname(os.path.realpath(__file__))
16 log_path = os.path.join(os.path.dirname(cur_path), 'logs')
17 # 如果不存在这个logs文件夹,就自动创建一个
18 if not os.path.exists(log_path): os.mkdir(log_path)
19
20
21 class Log():
22     def __init__(self):
23         # 文件的命名
24         self.logname = os.path.join(log_path, '%s.log' % time.strftime('%Y_%m_%d'))
25         self.logger = logging.getLogger()
26         self.logger.setLevel(logging.DEBUG)
27         # 日志输出格式
28         self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')
29
30     def __console(self, level, message):
31         # 创建一个FileHandler,用于写到本地
32         # fh = logging.FileHandler(self.logname, 'a')  # 追加模式  这个是python2的
33         fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')  # 这个是python3的
34         fh.setLevel(logging.DEBUG)
35         fh.setFormatter(self.formatter)
36         self.logger.addHandler(fh)
37
38         # 创建一个StreamHandler,用于输出到控制台
39         ch = logging.StreamHandler()
40         ch.setLevel(logging.DEBUG)
41         ch.setFormatter(self.formatter)
42         self.logger.addHandler(ch)
43
44         if level == 'info':
45             self.logger.info(message)
46         elif level == 'debug':
47             self.logger.debug(message)
48         elif level == 'warning':
49             self.logger.warning(message)
50         elif level == 'error':
51             self.logger.error(message)
52         # 这两行代码是为了避免日志输出重复问题
53         self.logger.removeHandler(ch)
54         self.logger.removeHandler(fh)
55         # 关闭打开的文件
56         fh.close()
57
58     def debug(self, message):
59         self.__console('debug', message)
60
61     def info(self, message):
62         self.__console('info', message)
63
64     def warning(self, message):
65         self.__console('warning', message)
66
67     def error(self, message):
68         self.__console('error', message)
69
70
71 if __name__ == "__main__":
72     log = Log()
73     log.info("---测试开始----")
74     log.info("操作步骤1,2,3")
75     log.warning("----测试结束----")

五、case放用例

1、常用的接口,需要检查被调用的单独封装处理,如登录等


2、test开头的用例

六、logs日志查看

1、运行完后日志都会收集到logs文件夹以日期命名

七、生成测试报告

1、这里调用的是HTMLTestRunner生成html的测试报告

八、发送报告到邮箱

1、运行run_main.py就会自动生成报告,然后发送到邮箱了

(这里QQ邮箱的展示是有问题的,一般用企业邮箱的话,是可以正常展示的)

九、小结

1、问题:在python3.7中使用sendmail进行邮件发送,mailInfo[“to”]为逗号分隔的str类型,结果只有第一个邮件地址能收到邮件。将邮箱前后对调后,还是第一个邮箱可以收到测试报告,后边的邮箱收不到邮件。

折腾好久,邮件里可以看到收件人有多个,实际上始终只能第一个收件人可以收到邮件。经多次搜索,发现是这样:email中收件人和sendmail中的收件人是没啥联系的。

sendmail中收件人,它的格式应该为list。这个为实际的收件人地址。

而msg[‘To’] 格式是字符串(str)。这个只是为了邮件中打印出来而已。

sendmail查源码,python/lib/smtplib.py大概690行左右,或者搜索tolist。

解决方法:经过多次测试发现MIMEText()[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型。

知道这个原因后,将这一行代码:

smtp.sendmail(sender, receiver, msg.as_string())
替换为下边这样就可以了:

smtp.sendmail(sender, receiver.split(’,’), msg.as_string())

当然了,以上是个人的愚见,如果你有更巧妙的解决办法,欢迎指教和讨论。

2、问题:在边写边做的过程中,遇到的另为一个奇葩的问题就是,在配置文件里加上中文的注释之后,老是报编码错误,报错如下:

这个也折腾了好久,由于时间太晚了,实在是不想折腾了,所以就想着,那我不加注释了,先让代码跑起来再说了,但是这个问题一直困扰着我,如果不解决,以后遇到类似的问题,人家非要你加注释,你绕都绕不过,怎么办???吾日三省吾身,自己问自己。完了还

是没办法,自己放不过自己,还是解决吧。完了自己 冷静了一下,静下心来捋了一下思路,由于胡子不够长,所有就只能摸摸自己头,冷静分析了一下:

(1)分析问题(bug)--------读取配置文件报编码错误,那就一定是在读取配置文件的时候,没有注意编码的问题导致出错

(2)解决问题(bug)--------读取配置文件的时候,加上编码encoding=“utf-8” 即可

(3)定位问题(bug)--------全部代码,读取配置文件的只有邮箱信息,邮箱信息又在readconfig.py文件里,问题范围有缩小了,怀疑对象有缩小了,目标嫌疑人已经锁定,下一步找出证据,判他死刑

(4)用证据说话--------------查看读取配置文件时,是否有编码问题,没有注意,果不其然是这个问题 :

(5)弹药上膛-------------加上编码 encoding=“utf-8” 即可

(6)下令开枪,判处死刑----------运行代码,顺利通过,邮件发出,大功告成

python接口自动化(四十二)- 项目架构设计之大结局(超详解)相关推荐

  1. python接口自动化(十二)--https请求(SSL)(详解)

    简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [ ...

  2. 【总结】我的十二个架构设计原则

    谨记 没有最好的架构,只有最适合的架构 好的架构不是设计出来的,是演进变化而来的 每一位架构师,在做架构设计时,都或多或少地会有一些自己架构设计原则.这里和你分享一些过去一直指导我的一些架构设计原则, ...

  3. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)–发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先了 ...

  4. python控制手机模拟器_Appium+python自动化之连接模拟器并启动淘宝APP(超详解)...

    简介 上一篇讲解完模拟器的安装.配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑 ...

  5. 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/327.html 很多童鞋说 ...

  6. Android群英传读书笔记——第十二章:Android 5.X新特性详解

    第十二章目录 12.1 Android5.X UI设计初步 12.1.1 材料的形态模拟 12.1.2 更加真实的动画 12.1.3 大色块的使用 12.2 Material Design主题 12. ...

  7. 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一.配置问题分析及解决方案 1.问题分析 2.解决方案 二.Spring Cloud Config 介绍 1.Spring Cloud Config特性 2.Spring Cloud Confi ...

  8. netty的零拷贝、架构设计、ByteBuf扩容机制详解

    文章目录 1. netty高并发架构设计精髓 ①:主从.Reactor线程模型 ②:NIO多路复用非阻塞 ③:无锁串行化设计思想 ④:高可用.可扩展架构 ⑤:直接内存和零拷贝 ⑥:ByteBuf内存池 ...

  9. python接口自动化(十四)--session关联接口(详解)

    简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...

最新文章

  1. 中国地址住址五级以下
  2. CSMA/CD在全双工和半双工模式下的区别
  3. 2014 UESTC暑前集训搜索专题解题报告
  4. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...
  5. WebMagic功能——XPath、CSS选择器、正则表达式 || 抽取元素API、获取结果API || ​​​​​​​获取链接||​​​​​​​使用Pipeline保存结果
  6. quartz.properties配置文件详解
  7. 5分钟部署一个Hello World Servlet到CloudFoundry
  8. F5 IIS Log获取客户端源IP
  9. 推荐系统遇上深度学习(七)--NFM模型理论和实践
  10. mat 释放_Square Ma?mat住宅区:释放公共空间,连接社区居民
  11. 利用Hexo搭建个人博客-博客发布篇
  12. linux设置组配置额步骤,linux 中磁盘配额设置
  13. [linux 技巧] 使用 screen 管理你的远程会话(转载)
  14. saltstack 系列(三)centos7使用saltstack小试牛刀
  15. 机器学习 | 决策树ID3算法
  16. java验证图片大小_java 校验图片的大小、尺寸、比例
  17. 太忙,没时间去电影院?在家看院线电影就用移动电影院APP
  18. 计算机word画铁路,利用WORD画地图
  19. 阿里架构专家教你打通Git任督二脉,20分钟搞定Git工作原理
  20. GAME(A)性能测试过程模型

热门文章

  1. Android 布局管理器 之 TableLayout
  2. Pyspark 最近使用的一些有趣姿势的梳理
  3. C++builder Tokyo 调用com 不正确的变量类型
  4. ThreadLocal深度解析
  5. 数据库连接池的作用及c3p0的详解(转载他人的--合理掌握学习方式)
  6. 10 python 扩展
  7. 图片上传插件WebUploader的坑
  8. 【Android】Binder机制
  9. finder怎么才能找到library
  10. ASP.Net缓存总结