diff --git a/Base/Class/Excel.py b/Base/Class/Excel.py index ca57c81..439c205 100644 --- a/Base/Class/Excel.py +++ b/Base/Class/Excel.py @@ -3,11 +3,11 @@ from openpyxl.cell import MergedCell from openpyxl.utils import get_column_letter, column_index_from_string -def colIndexFromString(string): +def col_index_from_string(string): return column_index_from_string(string) - 1 -def rowIndexFromString(string): +def row_index_from_string(string): return int(string) - 1 @@ -31,7 +31,7 @@ class Excel: raise Exception('文件已经打开 | File has been opened.') if filename: self.__filename__ = os.path.abspath(filename) - self.__workbook__ = openpyxl.load_workbook(filename, read_only=read_only) + self.__workbook__ = openpyxl.load_workbook(filename, read_only=False) self.__autosave__ = auto_save self.select(sheet) else: @@ -181,6 +181,8 @@ class Excel: :param filename: 另存为的文件路径,默认为保存文件 | The file path to save as, the default is to save the file. :return: """ + if filename is None and self.__readonly__: + raise Exception('只读模式 | Read-only') self.__workbook__.save(filename or self.__filename__) return True diff --git a/Base/Class/Json.py b/Base/Class/Json.py index 74c0703..1341158 100644 --- a/Base/Class/Json.py +++ b/Base/Class/Json.py @@ -1,8 +1,8 @@ import json -def json_encode(data, indent=None): - return json.dumps(data, indent=indent) +def json_encode(data, indent=None, unicode=True): + return json.dumps(data, indent=indent, ensure_ascii=unicode) def json_decode(data): @@ -17,4 +17,5 @@ if __name__ == '__main__': """ print(json_encode(data_encode)) print(json_encode(data_encode, indent=4)) + print(json_encode(data_encode, indent=4, unicode=False)) print(json_decode(data_decode)) diff --git a/Base/Class/Yaml.py b/Base/Class/Yaml.py index 9ed914e..5e6e4e7 100644 --- a/Base/Class/Yaml.py +++ b/Base/Class/Yaml.py @@ -1,8 +1,8 @@ import yaml -def yaml_encode(data, indent=None): - return yaml.dump(data, indent=indent, allow_unicode=True, sort_keys=False) +def yaml_encode(data, indent=None, unicode=False): + return yaml.dump(data, indent=indent, allow_unicode=not unicode, sort_keys=False) def yaml_decode(data): @@ -23,4 +23,5 @@ if __name__ == '__main__': b: 5 """ print(yaml_encode(data_encode)) + print(yaml_encode(data_encode, unicode=True)) print(yaml_decode(data_decode)) diff --git a/Business/Class/ExcelUtils.py b/Business/Class/ExcelUtils.py new file mode 100644 index 0000000..c3409e3 --- /dev/null +++ b/Business/Class/ExcelUtils.py @@ -0,0 +1,46 @@ +from Base.Class.Excel import * + + +def read_view_dict(filename=None, sheet=None, + area='', from_col=0, from_row=0, to_col=0, to_row=0, fields=None, + auto_truncate=False): + view = Excel().open(filename=filename, read_only=True).select(sheet).cellGetView( + area=area, from_col=from_col, from_row=from_row, to_col=to_col, to_row=to_row + ) + tabs = [] + try: + for i in range(len(view[0])): + try: + if not isinstance(fields[i], str): + raise TypeError() + tabs.append(fields[i]) + except: + tabs.append('col' + str(i)) + except: + pass + if len(tabs) != len(set(tabs)): + raise Exception('字段存在重复项目 | There are duplicates in the field') + data = [] + for line in view: + if auto_truncate: + none_number = 0 + for value in line: + if value is None: + none_number += 1 + if len(line) == none_number: + break + line_dict = {} + for i in range(len(line)): + line_dict[tabs[i]] = line[i] + data.append(line_dict) + return data + + + + + + +if __name__ == '__main__': + from Base.Class.Json import * + from Base.Class.Yaml import * + print(json_encode(read_view_dict(filename='../../example.xlsx', sheet='表一', area='A2:F530', fields=['id','name','age','city','mark1','mark2'], auto_truncate=True), 4, False)) diff --git a/Business/Class/JsonOrYaml.py b/Business/Class/JsonOrYaml.py new file mode 100644 index 0000000..8f70b0d --- /dev/null +++ b/Business/Class/JsonOrYaml.py @@ -0,0 +1,12 @@ +from Base.Class.Json import * +from Base.Class.Yaml import * + + +def auto_decode(data): + try: + try: + return json_decode(data) + except: + return yaml_decode(data) + except: + raise Exception('非Json或Yaml数据格式 | String in not a Json or Yaml format.') diff --git a/HTMLTestRunner.py b/HTMLTestRunner.py new file mode 100644 index 0000000..89b29c3 --- /dev/null +++ b/HTMLTestRunner.py @@ -0,0 +1,1358 @@ +# coding=utf-8 +""" +A TestRunner for use with the Python unit testing framework. It +generates a HTML report to show the result at a glance. + +The simplest way to use this is to invoke its main method. E.g. + + import unittest + import HTMLTestRunner + + ... define your tests ... + + if __name__ == '__main__': + HTMLTestRunner.main() + + +For more customization options, instantiates a HTMLTestRunner object. +HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g. + + # output to a file + fp = file('my_report.html', 'wb') + runner = HTMLTestRunner.HTMLTestRunner( + stream=fp, + title='My unit test', + description='This demonstrates the report output by HTMLTestRunner.' + ) + + # Use an external stylesheet. + # See the Template_mixin class for more customizable options + runner.STYLESHEET_TMPL = '' + + # run the test + runner.run(my_test_suite) + + +------------------------------------------------------------------------ +Copyright (c) 2004-2007, Wai Yip Tung +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name Wai Yip Tung nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +# URL: http://tungwaiyip.info/software/HTMLTestRunner.html +# URL: https://github.com/Gelomen/HTMLTestReportCN-ScreenShot + +__author__ = "Wai Yip Tung, Findyou, boafantasy, Gelomen" +__version__ = "1.2.0" + +""" +Change History +Version 1.3.0 -- Gelomen +* 增加初始化报告目录自定义 +* 升级版本 +* 优化命名 + +Version 1.2.0 -- Gelomen +* 优化用例说明显示 +* 错误和失败报告里可以放入多张截图 + +Version 1.1.0 -- Gelomen +* 优化报告截图写入方式 + +Version 1.0.2 -- Gelomen +* 新增测试结果统计饼图 +* 优化筛选时只显示预览 + +Version 1.0.1 -- Gelomen +* 修复报告存入文件夹的bug +* 优化报告的命名方式 + +Version 1.0.0 -- Gelomen +* 修改测试报告文件夹路径的获取方式 +* 修改截图获取文件夹路径的获取方式 + +Version 0.9.9 -- Gelomen +* 优化报告文件夹命名 +* 优化截图存放的目录 +* 增加图片阴影边框以突出图片 +* 优化 失败用例合集 和 错误用例合集 显示的颜色 + +Version 0.9.8 -- Gelomen +* 优化回到顶部按钮的显示方式 + +Version 0.9.7 -- Gelomen +* 优化截图显示,滚动页面会固定居中 + +Version 0.9.6 -- Gelomen +* 新增打开图片的特效,可以直接在当前页面看截图 + +Version 0.9.5 -- Gelomen +* heading新增 失败 和 错误 测试用例合集 + +Version 0.9.4 -- Gelomen +* 修复失败和错误用例里对应按钮的颜色 + +Version 0.9.3 -- Gelomen +* 修复点击失败或错误按钮后,浏览器版本和截图的列不会隐藏的bug + +Version 0.9.2 -- Gelomen +* 美化 浏览器版本 和 截图 的显示 + +Version 0.9.1 -- Gelomen +* 使用UI自动化测试时,增加 错误、失败 详细信息的 浏览器类型和版本 + +Version 0.9.0 -- Gelomen +* 可通过 `need_screenshot=1` 作为开关,将报告开启截图功能 +* 增加 失败 和 错误 详细信息的 截图链接 + +Version 0.8.4 -- Gelomen +* 删除 失败模块 的显示 + +Version 0.8.3 -- Gelomen +* 修复 测试结果 的筛选 +* 优化 失败、错误 小图标的颜色 +* 增加表格 最后一列 的显示,以美化表格 + +Version 0.8.2.1 -Findyou +* 改为支持python3 + +Version 0.8.2.1 -Findyou +* 支持中文,汉化 +* 调整样式,美化(需要连入网络,使用的百度的Bootstrap.js) +* 增加 通过分类显示、测试人员、通过率的展示 +* 优化“详细”与“收起”状态的变换 +* 增加返回顶部的锚点 + +Version 0.8.2 +* Show output inline instead of popup window (Viorel Lupu). + +Version in 0.8.1 +* Validated XHTML (Wolfgang Borgert). +* Added description of test classes and test cases. + +Version in 0.8.0 +* Define Template_mixin class for customization. +* Workaround a IE 6 bug that it does not treat + + + + %(stylesheet)s + +
+ +%(heading)s +%(report)s +%(ending)s + + +