整体代码如下:

  1. import os
  2. import sys
  3. import time
  4. import datetime
  5. import unittest
  6. import HTMLTestRunner
  7.  
  8. # git config --global user.name “用户名”
  9.  
  10. # git config --global user.email “邮箱”
  11.  
  12. # 获取项目路径下的目录
  13. path_project = os.path.split(os.path.abspath(__file__))[0]
  14. os.chdir(path_project)
  15.  
  16. # 将项目路径保存
  17. sys.path.append(path_project)
  18.  
  19. # 获取当前文件所在目录
  20. CUR_PATH = os.path.dirname(os.path.realpath(__file__))
  21.  
  22. # 设置时间格式
  23. day_now = time.strftime("%Y-%m-%d")
  24. time_now = time.strftime("%H-%M-%S")
  25.  
  26. def add_case(case_name='Case', rule='test*.py'):
  27. # 加载所有的用例
  28. case_path = case_name
  29. # case_path = os.path.join(CUR_PATH,case_name)
  30. # 定义方法的参数
  31. discover = unittest.defaultTestLoader.discover(case_path,
  32. pattern=rule,
  33. top_level_dir=CUR_PATH)
  34. print("用例所在位置 %s 执行的文件 %s " % (case_path, rule))
  35. return discover
  36.  
  37. def run_case(all_case, reportName='report', filename="filename"):
  38. # 1.1报告存放路径
  39. report_path = os.path.join(os.getcwd(), reportName)
  40.  
  41. # 1.2报告根据时间来分类
  42. report_path = os.path.join(report_path, day_now)
  43. if not os.path.exists(report_path): os.mkdir(report_path)
  44.  
  45. filename = "%s-%s.html" % (time_now, filename)
  46. report_abspath = os.path.join(report_path, filename)
  47.  
  48. print("新创建报告文件所在位置 %s " % report_abspath)
  49.  
  50. fp = open(report_abspath, "wb")
  51. runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
  52. title=u'自动化测试报告测试结果如下:',
  53. description=u'用例执行情况:')
  54.  
  55. # 调用add_case函数返回值
  56. runner.run(all_case)
  57. fp.close()
  58.  
  59. def get_report_file(report_path):
  60. # 获取最新的测试报告
  61. lists = os.listdir(report_path)
  62. lists.sort(key=lambda fn: os.path.getmtime(os.path.join(report_path, fn)))
  63. print("最新报告名 %s" % lists[-1])
  64.  
  65. # 找到最新生成的报告文件
  66. report_file = os.path.join(report_path, lists[-1])
  67. return report_file
  68.  
  69. def run_main(file_name, rule='test*.py'):
  70. # 加载用例
  71. all_case = add_case(file_name, rule)
  72.  
  73. # 运行文件所在目录为文件名
  74. file_name = str.split(file_name, '\\')[-1]
  75.  
  76. # 生成测试报告的路径
  77. run_case(all_case, filename=file_name)
  78.  
  79. # 获取最新测试报告所在的文件路径
  80.  
  81. report_path = os.path.join("report", day_now) # 最新报告文件夹在项目中的路径
  82. report_path = os.path.join(CUR_PATH, report_path) # 拼接项目
  83.  
  84. # 获取最新的测试报告
  85. report_file = get_report_file(report_path)
  86. print("最新报告路径为{0}".format(report_file))
  87.  
  88. def list_dir(file_dir):
  89. '''
  90. 通过 listdir 得到的是仅当前路径下的文件名,不包括子目录中的文件,如果需要得到所有文件需要递归
  91. '''
  92. # print('\n\n<><><><><><> listdir <><><><><><>')
  93. # print("current dir : {0}".format(file_dir))
  94. file_dir = os.path.join(CUR_PATH, file_dir)
  95. dir_list = os.listdir(file_dir)
  96. file_name = []
  97. for cur_file in dir_list:
  98. # 获取文件的绝对路径
  99. path = os.path.join(file_dir, cur_file)
  100. if os.path.isfile(path): # 判断是否是文件还是目录需要用绝对路径
  101. # print("{0} : is file!".format(cur_file))
  102. continue
  103. if os.path.isdir(path):
  104. # print("{0} : is dir!".format(cur_file))
  105. list_dir(path) # 递归子目录
  106. file_name.append(cur_file)
  107. return file_name
  108.  
  109. def start_loading_case():
  110. file_name = r'case'
  111. all_dir = list_dir(file_name)
  112.  
  113. for dir in range(len(all_dir)):
  114. if "__pycache__" in all_dir[dir]:
  115. continue
  116. else:
  117. dir = os.path.join(file_name, all_dir[dir])
  118. print("需要运行的文件: %s" % dir)
  119. run_main(dir)
  120.  
  121. def start_single_loading():
  122. run_main('demo', "test_*.py")
  123.  
  124. if __name__ == '__main__':
  125. # 记录运行时间
  126. startTime = datetime.datetime.now()
  127. print("\nStart Run Time: %s\n" % startTime)
  128. # 指定case所在位置并自动运行位置下需要运行的test文件夹,并且每个文件夹都自动生成一个相应的html报告
  129. start_loading_case()
  130. # 指定需要运行的test文件夹,运行完毕之后只生成一个相应的html报告
  131. # start_single_loading()
  132. # 记录结束时间
  133. stopTime = datetime.datetime.now()
  134. print("\nFinish Run Time: %s\n" % stopTime)
  135. # 打印一共运行的时间
  136. print('\nRunning time: %s\n' % (stopTime - startTime), file=sys.stderr)

项目所在位置:

https://github.com/namexiaohuihui/demotest

个人记录而已,不理解的可以留言。请勿直接喷

unittest 运行slenium(五)---运行代码并生成HTMLTestRunner报告的更多相关文章

  1. 【python-HTMLTestRunner】生成HTMLTestRunner报告报错ERROR 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    [python-HTMLTestRunner]生成HTMLTestRunner报告报错:ERROR 'ascii' codec can't decode byte 0xe5 in position 0 ...

  2. Python不生成HTMLTestRunner报告-转载学习

    1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...

  3. 如何生成HTMLTestRunner报告

    今天,学习了如何生成HTMLTestRunner测试报告. 接上篇文章,对于unittest框架,运行后,测试结果不便于查看,同时多个case存在的时候,可能会导致case result记录不正确的情 ...

  4. 用PyCharm执行测试成功但无法生成HTMLTestRunner报告

    问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执 ...

  5. 关于python3 使用pycharm+unittest+html+HTMLTestRunner 测试用例运行正常,但却不能生成测试报告的解决方法

    关于python3 使用pycharm+unittest+html+HTMLTestRunner 测试用例运行正常,但却不能生成测试报告的解决方法 这个问题我也遇到过,以下是解决办法   该方法适用于 ...

  6. 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

    程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...

  7. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  8. Jmeter非GUI运行,生成html报告

    一.JMete执行方式 JMeter执行方式有2种,一种是GUI模式,一种是非GUI模式.GUI模式就是界面模式,非GUI模式就是命令行模式.界面模式主要用来编写和调试脚本用的,项目的真正执行最好是采 ...

  9. iOS:xCode7版本运行xCode8.0的代码

    怎么在xCode7版本上运行xCode8.0的代码? 1.右键你的"LaunchScreen.sb"文件并用编辑器打开sb 2.删掉"<capability nam ...

随机推荐

  1. iOS 不允许横屏的简单代码

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWi ...

  2. Ubuntu18安装虚拟机virtualbox

    环境查看 安装虚拟机 apt install virtualbox 图形化界面启动 virtualbox 其余创建虚拟机和安装和在Windows安装配置一样,不详述.

  3. CentOS 7/6系统升级内核版本到5.2.2

    由于公司服务器新业务需要,需要将CentOS 7系统的内核(3.10.0-229)进行升级. 关于内核版本的定义:版本性质:主分支ml(mainline),稳定版(stable),长期维护版lt(lo ...

  4. mycat搭建环境

    macos完全卸载mysql: https://blog.csdn.net/u012721519/article/details/55002626 踩过的坑: mycat1.6不支持单库分表; 最少要 ...

  5. 深入css过渡transition

    通过过渡transition,可以让web前端开发人员不需要javascript就可以实现简单的动画交互效果.过渡属性看似简单,但实际上它有很多需要注意的细节和容易混淆的地方. 过渡transitio ...

  6. linux下查看进程的状态 /proc/[pid]/status

    查看进程的状态: 1.查看进程的pid,以java为例:ps -ef | grep java 2.查看进程状态:cat /proc/[pid]/status 关键字: linux [root@loca ...

  7. 探索安卓热修复框架AndFix的奥秘

    虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug. 1.什么是AndFix? ...

  8. linux input子系统详解

    首先,什么是linux的子系统: 输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动通过Driver->Input core->Event handler- ...

  9. [转帖]Kubernetes - nginx-ingress 配置跳坑指南

    Kubernetes - nginx-ingress 配置跳坑指南 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  10. JDBC预编译statement(preparedstatement)和statement的比较、execute与executeUpdate的区别

    和 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement除此之外,还能够通过设置 ...