实现给一个路径,去查找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)

测开之路五十五:实现类似于unittest查找case的更多相关文章

  1. 测开之路八十五:python处理csv文件

    写入csv文件 一:写入字典 二:写入普通数据 读取: 第一种:普通读取 第二种:读取csv并用namedtuple映射列名,类似于使用类的实例 第三种:字典形式 import csvfrom col ...

  2. 测开之路七十五:linux常用命令

    常用命令: ls:列出文件或目录 pwd:展示当前所在的目录 mkdir:创建目录 mkdir -p :创建连续的目录 cd:切换目录 vi:编辑内容,点i开始编辑,输入::wq保存 cat 显示文件 ...

  3. 测开之路六十五:UI测试平台之js

    //添加网址的函数,生成一个输入网址的标签,并且把标签append到id为cases下function browser() { var html = '\ <div class="ro ...

  4. 测开之路四十五:Django之最小程序

    安装Django库 Django最小程序 import sysfrom django.conf.urls import urlfrom django.conf import settingsfrom ...

  5. 测开之路三十五:css引入

    CSS是一种定义样式结构,如字体.颜色.位置等的语言,被用于描述网页上的信息格式化和现实的方式.CSS样式可以直接存储于HTML网页或者单独的样式单文件.无论哪一种方式,样式单包含将样式应用到指定类型 ...

  6. 测开之路一百零五:bootstrap的两种引用方式

    一:下载到本地引用: 3.3.7版本:https://getbootstrap.com/docs/3.3/getting-started/#download 下载后解压到本地项目中引用 第二种,cdn ...

  7. 测开之路七十六:性能测试蓝图之html

    <!-- 继承base模板 -->{% extends 'base.html' %} {% block script %} <!-- 从cdn引入ace edter的js --> ...

  8. 测开之路四十八:Django之重定向与cookie

    基础配置与上一篇一致 404错误 定义一个error页面 <!DOCTYPE html><html lang="en"><head> <m ...

  9. 测开之路八十九:HTML之图片处理

    <!--width.height设置图片尺寸 alt:当图片不能展示时,显示的内容 title:鼠标放上去时展示的内容--> <img src="../imges/img0 ...

随机推荐

  1. Vue-实现简单拖拽(自定义属性)

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  2. Learning OSG programing---Multi Camera in one window 在单窗口中创建多相机

    在学习OSG提供的例子osgCamera中,由于例子很长,涉及很多细节,考虑将其分解为几个小例子.本文介绍实现在一个窗口中添加多个相机的功能. 此函数接受一个Viewer引用类型参数,设置图形上下文的 ...

  3. Netty基础-BIO/NIO/AIO

    同步阻塞IO(BIO): 我们熟知的Socket编程就是BIO,每个请求对应一个线程去处理.一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作).阻塞的原因在于:操 ...

  4. python 实现加法

    https://ac.nowcoder.com/acm/contest/338/G 链接:https://ac.nowcoder.com/acm/contest/338/G来源:牛客网 题目描述 Th ...

  5. [转]ORACLE优化器RBO与CBO的区别

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  6. GeneXus笔记本—常用函数(上)

    国庆放假没事怎么办?写点笔记充会儿电! ≖‿≖✧   哈哈哈 !!最近在参与公司的其中一个项目中,发现了一些函数自己没见过 也没使用过,但是这些函数都是GeneXus中自带的一些 这此记录的目的就是为 ...

  7. Vue-cli3 环境的搭建

    Vue-cli3 环境的搭建 准备 浏览器插件:Vue.js devtools VsCode 和 VsCode 插件 WebStorm Nodejs vue-cli git 起飞 安装vue-cli3 ...

  8. 五 shell 变量与字符串操作

    特点:1 shell变量没有数据类型的区分 2 Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”.    3  设定的变量值只在当前shell环境中有作用    4   不能以数字开头 ...

  9. Java实现sock5代理服务器

    入职练手socks5代理服务器,过程总结一下. 1.下载火狐浏览器,设定代理为socks5代理,地址为127.0.0.1:1080. 2.socks5协议1928,中文版,原版,认真阅读 3.按照协议 ...

  10. html5 带声音的导航

    代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3. ...