实现给一个路径,去查找test开头的测试用例文件

创建一个计算器的类,方便后面测试用

class Calculator(object):

    def add(self, x, y):
return x + y def sub(self, x, y):
return x - y def mul(self, x, y):
return x * y def div(self, x, y):
return x / y

创建一个unittest的用例集

# coding=utf-8

from unittest import main
from unittest import TestCase
from src import Calculator class TestCalculator(TestCase): def setUp(self):
self.calc = Calculator()
print("setUp") def tearDown(self):
print("tearDown") def test_add(self):
result = self.calc.add(2, 3)
self.assertEqual(result, 5, u"测试加法。")
print("test_add") def test_sub(self):
result = self.calc.sub(2, 3)
self.assertEqual(result, -1, u"测试减法。")
print("test_sub") def test_mul(self):
result = self.calc.mul(2, 3)
self.assertEqual(result, 6, u"测试乘法。")
print("test_mul") def test_div(self):
result = self.calc.div(4, 2)
self.assertEqual(result, 2, u"测试除法。")
print("test_div") if __name__ == '__main__':
main()

查找用例的类

import sys

class Discovery(object):

    def __init__(self):
pass def find_case_by_path(self, path):
""" 获取用例 """
files = self.get_files(path, include=['.py'], exclude=['.xml', '.json', '.pyc'])
cases = self.load_cases(files)
return cases def get_files(self, path, include=[], exclude=['.xml', '.iml']):
""" path是要列出文件的路径。根据代码规则,黑名单机制优先于白名单机制执行。 """
files = []
# 如果路径不存在,则直接返回空列表。
if not os.path.exists(path):
return files
# 如果路径是文件,则直接返回文件。
if os.path.isfile(path):
# 这里处理exclude规则--黑名单机制。
if exclude:
for rule in exclude:
if path.find(rule) != -1:
return files
# 这里处理include规则--白名单机制。
if include:
for rule in include:
if path.find(rule) != -1:
files.append(path)
else:
files.append(path)
return files
# 如果路径是目录,则列出目录内容,递归处理。
if os.path.isdir(path):
results = os.listdir(path)
for result in results:
# 将原路径与路径下文件名拼接成新路径。
new_path = "/".join([path, result])
files.extend(self.get_files(new_path, include, exclude))
return files def load_cases(self, files):
""" 加载用例 """
cases = []
for file in files:
if file.find("test") == -1: # 判断文件名里面没有“test”就查找下一个
continue
case = {'file': file} # 如果有就存到case字典里面
directory = os.path.dirname(file) # 获取到文件的目录
sys.path.append(directory) # 用sys把此文件的目录加进去
name = os.path.basename(file)[:-3] # 获取文件名
module = __import__(name) # 反射导入文件
case.setdefault("module", module) # 把文件加入到case
for attr in dir(module):
if attr.find("TestCase") != -1: # 判断文件里面有没有继承了“TestCase”的类(兼容unittest)
continue
if attr.find("Test") == -1: # 判断类名里面有没有Test
continue
object = getattr(module, attr)() # 反射的方式实例化对象
case.setdefault("object", object) # 获取这个对象
case.setdefault("method", [])
for attr in dir(object): # 提取测试用例里面的方法
# 这里是断言结果。
if attr.find('result') != -1:
case.setdefault("result", getattr(object, attr))
if not callable(getattr(object, attr)): # 从object代表的对象获取attr代表的函数,判断是否可以调用
continue
if attr.find("test") != -1:
case["method"].append(getattr(object, attr))
if attr.find("setUp") != -1:
case.setdefault("setUp", getattr(object, attr))
if attr.find("tearDown") != -1:
case.setdefault("tearDown", getattr(object, attr))
cases.append(case)
return cases if __name__ == '__main__':
discovery = Discovery()
import os case_path = os.path.join(os.path.dirname(os.getcwd()), 'case') # case 文件夹
print(case_path)
cases = discovery.find_case_by_path(case_path)
print(cases)

最新文章

  1. SQLSERVER2014中的新功能
  2. 【C语言】05-printf和scanf函数
  3. WeCenter程序安装
  4. [Angular2 Router] Style the Active Angular 2 Navigation Element with routerLinkActive
  5. 关于打开ILDASM的方法
  6. UIimageView GIF动画
  7. AngularJS框架研究(一)
  8. sphinx分域搜索【不】需要在conf文件中使用sql_field_string
  9. 【转】php缓冲 output_buffering和ob_start
  10. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器
  11. node.js的安装及配置
  12. IO 异常:The Network Adapter could not establish the connection 怎么解决
  13. c#开发wps插件
  14. BZOJ_2238_Mst_树剖+线段树
  15. .NET Core TDD 前传: 编写易于测试的代码 -- 依赖项
  16. JavaScript实现获取两个排序数组的中位数算法示例
  17. iptables防DDOS攻击和CC攻击设置
  18. JsExcelXml.js的源码
  19. ModBus通信协议的【Modbus RTU 协议使用汇总】
  20. 详解centos7配置本地yum源的方法

热门文章

  1. 进程之间的通讯Queue简单应用
  2. [Python3 填坑] 014 类的常用魔术方法举例
  3. thinkphp开发微信小程序后台流程
  4. ubuntu 系统类似QQ截图工具:DeepinScrot,flameshot
  5. vue中监听返回键
  6. Java JNA (一)—— 调用dll
  7. 基于Xilinx Zynq的计算处理平台
  8. 数据结构 java概况
  9. try、catch、finally--try块里有return,finally还执行吗?
  10. ltp-ddt realtime_cpu_load涉及的cyclictest 交叉编译