def __init__(self, stream=sys.stdout, error_stream=sys.stderr, output_testresult=False, output_summary=True): '''构造函数 :param stream: 指定要输出的流设备 :type stream: file :param output_testresult: 是否输出测试用例执行的日志 :type output_testresult: boolean :param output_summary: 是否输出执行汇总信息 :type output_summary: boolean ''' super(StreamTestReport, self).__init__() self._stream, encoding = ensure_binary_stream(stream) self._err_stream, _ = ensure_binary_stream(error_stream) self._write = lambda x: self._stream.write( smart_binary(x, encoding=encoding)) self._write_err = lambda x: self._err_stream.write( smart_binary(x, encoding=encoding)) self._output_testresult = output_testresult self._output_summary = output_summary self._passed_testresults = [] self._failed_testresults = []
def send_text(self, message): ''' NOTES Fragmented(=continuation) messages are not being used since their usage is needed in very limited cases - when we don't know the payload length. ''' # Validate message if isinstance(message, bytes): message = smart_binary( message) # this is slower but assures we have UTF-8 if not message: print("Can\'t send message, message is not valid UTF-8") return False elif isinstance(message, str) or isinstance(message, unicode): pass else: print( 'Can\'t send message, message has to be a string or bytes. Given type is %s' % type(message)) return False header = bytearray() payload = smart_binary(message) payload_length = len(payload) # Normal payload if payload_length <= 125: header.append(FIN | OPCODE_TEXT) header.append(payload_length) # Extended payload elif payload_length >= 126 and payload_length <= 65535: header.append(FIN | OPCODE_TEXT) header.append(PAYLOAD_LEN_EXT16) header.extend(struct.pack(">H", payload_length)) # Huge extended payload elif payload_length < 18446744073709551616: header.append(FIN | OPCODE_TEXT) header.append(PAYLOAD_LEN_EXT64) header.extend(struct.pack(">Q", payload_length)) else: raise Exception( "Message is too big. Consider breaking it into chunks.") return self.request.send(header + payload)
def test_smart_binary(self): s = u'11111\udce444444' result = util.smart_binary(s) if six.PY3: self.assertEqual(result, b"'11111\\udce444444'") else: self.assertEqual(result, '11111\xed\xb3\xa444444')
def get_file(self): file_name = '%s_%s.js' % (self._translated_name, get_time_str()) if not path_exists(file_name): var_name = os.path.basename(file_name) var_name = os.path.splitext(file_name)[0].replace(".", "_") content = "var %s = %s" % (var_name, json.dumps(self._data)) content = smart_binary(content) with codecs_open(file_name, mode="wb") as fd: fd.write(content) return file_name
def __init__(self, stream=sys.stdout): '''构造函数 :param stream: 流对象 :type stream: file ''' super(StreamResult, self).__init__() self._stream, encoding = ensure_binary_stream(stream) self._write = lambda x: self._stream.write(smart_binary(x, encoding=encoding)) self._step_results = []
def log_load_error(self, loader, name, error): """记录一个加载失败的用例或用例集 :param loader: 用例加载器 :type loader: TestLoader :param name: 名称 :type name: str :param error: 错误信息 :type error: str """ line = "" for line in reversed(error.split("\n")): if line.strip(): break self._write_err("load test failed: %s (error: %s)\n" % (name, line)) self._write_err(smart_binary(error))
def log_test_result(self, testcase, testresult): '''记录一个测试结果 :param testcase: 测试用例 :type testcase: TestCase :param testresult: 测试结果 :type testresult: XmlResult ''' super(XMLTestReport, self).log_test_result(testcase, testresult) casemark = saxutils.escape(testcase.test_doc) nodestr = """<TestResult result="%s" log="%s" status="%s">%s</TestResult> """ % (testresult.passed, testresult.file_path, testcase.status, casemark) doc2 = dom.parseString(smart_binary(nodestr)) resultNode = doc2.childNodes[0] resultNode.setAttribute("name", smart_text(saxutils.escape(testcase.test_name))) resultNode.setAttribute("owner", smart_text(saxutils.escape(testcase.owner))) self._runrstnode.appendChild(resultNode)
def log_load_error(self, loader, name, error): '''记录一个加载失败的用例或用例集 :param loader: 用例加载器 :type loader: TestLoader :param name: 名称 :type name: str :param error: 错误信息 :type error: str ''' log_file = "%s.log" % name nodestr = """<LoadTestError name="%s" log="%s"></LoadTestError> """ % ( smart_text(saxutils.escape(name)), log_file, ) doc2 = dom.parseString(nodestr) errNode = doc2.childNodes[0] self._runrstnode.appendChild(errNode) with codecs_open(log_file, 'wb') as fd: fd.write(smart_binary(error))
def log_record(self, level, tag, msg, record={}): '''增加一个记录 :param level: 日志级别 :param msg: 日志消息 :param tag: 日志标签 :param record: 日志记录信息 :type level: string :type tag: string :type msg: string :type record: dict ''' if tag == 'LOADER' and level == EnumLogLevel.ERROR: if 'error_testname' in record and 'error' in record: testname = record['error_testname'] mdfailsnode = self._xmldoc.createElement("LoadFailure") self._runrstnode.appendChild(mdfailsnode) logfile = '%s.log' % testname xmltpl = """<Module name="%s" log="%s"/>""" % (testname, logfile) mdfailsnode.appendChild(dom.parseString(xmltpl).childNodes[0]) with codecs_open(logfile, 'wb') as fd: fd.write(smart_binary(record['error']))
def translate_test_name(testname): if six.PY2: translated_name = smart_binary(testname).translate(TRANS) else: translated_name = smart_text(testname).translate(TRANS) return translated_name
def format(self, record): s = super(_Formatter, self).format(record) return smart_binary(s, encoding=_encoding)