网站设计平台及开发工具楼市最新消息价格

news/2025/9/23 20:43:54/文章来源:
网站设计平台及开发工具,楼市最新消息价格,找人搭建网站多少钱,互联网培训米西米西滴#xff0c;吃过中午饭来一篇#xff0c;话说#xff0c;上回书说道macaca 测试web#xff08;3#xff09;#xff0c;参数驱动来搞#xff0c;那么有小伙本又来给雷子来需求#xff0c; 登录模块能不能给我给重新封装一下吗#xff0c; 我说干嘛封装…米西米西滴吃过中午饭来一篇话说上回书说道macaca 测试web3参数驱动来搞那么有小伙本又来给雷子来需求 登录模块能不能给我给重新封装一下吗 我说干嘛封装现在不挺好于是乎接着小伙伴说封装好我可以用的地方就可以直接调用我想想是啊于是乎雷子说这不是问题你有需求雷子我有思路来来不要说了来来封装的代码展示下起名叫做login.py from page import page_data def login(deriver,username,password):deriver.element_by_id(page_data[username]).send_keys(username)deriver.element_by_id(page_data[password]).send_keys(password)deriver.element_by_id(page_data[login]).click() 小伙伴们说你给我用用我还不会用呢那么来来我给你上上代码 from macaca import WebDriver import time,ddt,BSTestRunner,unittest from config import die_arp,server_url,login_data from login import login ddt.ddt class BokeyuanTest(unittest.TestCase):def setUp(self):self.deriverWebDriver(die_arp,server_url)self.deriver.init()self.deriver.get(https://passport.cnblogs.com/user/signin)def tearDown(self):self.deriver.quit()ddt.data(*login_data)def test_login(self,login_data):login(self.deriver,login_data[username],login_data[username])time.sleep(1)self.assertTrue(self.deriver.element_by_id(login_data[id]).text,login_data[assert]) if __name__ __main__:suite unittest.TestSuite()now time.strftime(%Y-%m%d, time.localtime(time.time()))report_dir r%s.html % nowsuite.addTests(unittest.TestLoader().loadTestsFromTestCase(BokeyuanTest))re_open open(report_dir, wb)runner BSTestRunner.BSTestRunner(streamre_open, titledemo by macaca, description测试结果)runner.run(suite) 有没有感觉引用很简单呢是的 答案是肯定的就是函数的调用封装只要有思路了思路打开了那么一起还是问题吗不是问题不用你回答基于的搞定一切都好办 又有小伙伴说你给我运行运行下我说那么开始吧   测试完毕了   小伙伴说怎么有错误其实没有的这里是我的参数的问题可以忽略这是我设计用例设计的因为有些代码会牵扯到个人的隐私吗 测试有bug也是正常那么我们就是去解决就好。 这里呢   什么原来是我的断言写错了   什么我这个马虎 吧定位写错误了修改后可以正常运行了 那么有小伙伴说了你这个文件都放到一个目录   是不是感觉很难看感觉不舒服啊 那么好吧我再来给你给你优化下、   busines 可以业务逻辑的公共方法 data 可以存放一下数据 page 页面操作相关的 testcase  用例 testresult 测试结果  util 公共方法与业务无关的 run.py 运行文件 那么我们要把脚本呢进行调整了     login.pyfrom page.page import page_data def login(deriver,username,password):deriver.element_by_id(page_data[username]).send_keys(username)deriver.element_by_id(page_data[password]).send_keys(password)deriver.element_by_id(page_data[login]).click() conf.pydie_arp{platformName:Desktop,browserName:electron } server_url{hostname:localhost,post:3456 } login_data[ {username:北漂的,password:li1213456,id:tip_btn,assert:该用户不存在}, {username:,password:li123456,id:tip_input1,assert:请输入登录用户名}, {username:,password:,id:tip_input1,assert:请输入登录用户名}, {username:,password:li123456,id:tip_input1,assert:请输入登录用户名}, {username:北漂的雷子,password:li123456,id:tip_btn,assert:用户名或密码错误}, {username:北漂的雷子,password:,id:tip_input2,assert:请输入密码}, {username:北漂的雷子,password:li123456,id:feed_recent,assert:最新动态},] page.pypage_data{username:input1,password:input2,login:signin, } testbokeyuan.pyfrom macaca import WebDriver import time,ddt,unittest from data.config import die_arp,server_url,login_data from busines.login import login ddt.ddt class BokeyuanTest(unittest.TestCase):def setUp(self):self.deriverWebDriver(die_arp,server_url)self.deriver.init()self.deriver.get(https://passport.cnblogs.com/user/signin)def tearDown(self):self.deriver.quit()ddt.data(*login_data)def test_login(self,login_data):login(self.deriver,login_data[username],login_data[username])time.sleep(1)self.assertTrue(self.deriver.element_by_id(login_data[id]).text,login_data[assert]) run.pyfrom testcase.testbokeyuan import BokeyuanTest from util import BSTestRunner import os,unittest,time if __name__ __main__:suite unittest.TestSuite()now time.strftime(%Y-%m%d, time.localtime(time.time()))basedir os.path.abspath(os.path.dirname(__file__))file_dir os.path.join(basedir, testresult)fileos.path.join(file_dir,(now.html))suite.addTests(unittest.TestLoader().loadTestsFromTestCase(BokeyuanTest))re_open open(file, wb)runner BSTestRunner.BSTestRunner(streamre_open, titledemo by macaca, description测试结果)runner.run(suite) 写完就是这么可以run了思路很简单就是拆分组合包的调用基础的问题 run下一看看   报告也出来了。   里面的报错可以参考上面的解决方案 因为我电脑博客园访问现在有问题我自己都登录不了了只能用之前的浏览器记住的密码好坑爹啊一会再解决。 需求有没有解决好不好看的。 数据驱动数据与代码完全分离业务人员只需编写config以及少量简单代码目前只有一个登录功能后续会加入进去。 有没有感觉更进一步呢。 我们最大的希望就是 关键字驱动业务逻辑与代码完全分离业务人员只需编写excel表即可执行ui自动化测试 这些大家都要相信我们都可以实现的 后续都可以搞定通过配置文件去解决这些问题。 一路向前你会走的更远。 web4到此结束感谢大家的观看 本人github  https://github.com/liwanlei  欢迎starfork 有很多小伙伴不知道我的测报告有啥感觉很美观其实我也是用的开源的东西BSTestRunner 支持python3 具体代码 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 unittestimport BSTestRunner... define your tests ...if __name__ __main__:BSTestRunner.main()For more customization options, instantiates a BSTestRunner object. BSTestRunner is a counterpart to unittests TextTestRunner. E.g.# output to a filefp file(my_report.html, wb)runner BSTestRunner.BSTestRunner(streamfp,titleMy unit test,descriptionThis demonstrates the report output by BSTestRunner.)# Use an external stylesheet.# See the Template_mixin class for more customizable optionsrunner.STYLESHEET_TMPL link relstylesheet hrefmy_stylesheet.css typetext/css# run the testrunner.run(my_test_suite)------------------------------------------------------------------------ Copyright (c) 2004-2007, Wai Yip Tung Copyright (c) 2016, Eason Han 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 copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution. * Neither the name Wai Yip Tung nor the names of its contributors may beused to endorse or promote products derived from this software withoutspecific 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. __author__ Wai Yip Tung Eason Han __version__ 0.8.4 Change HistoryVersion 0.8.3 * Modify html style using bootstrap3.Version 0.8.3 * Prevent crash on class or module-level exceptions (Darren Wurf).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 script block as CDATA.Version in 0.7.1 * Back port to Python 2.3 (Frank Horowitz). * Fix missing scroll bars in detail log (Podi). # TODO: color stderr # TODO: simplify javascript using ,ore than 1 class in the class attribute?import datetime from io import StringIO as StringIO import sys import time import unittest from xml.sax import saxutils# ------------------------------------------------------------------------ # The redirectors below are used to capture output during testing. Output # sent to sys.stdout and sys.stderr are automatically captured. However # in some cases sys.stdout is already cached before BSTestRunner is # invoked (e.g. calling logging.basicConfig). In order to capture those # output, use the redirectors for the cached stream. # # e.g. # logging.basicConfig(streamBSTestRunner.stdout_redirector) # def to_unicode(s):return s# try:# return unicode(s)# except UnicodeDecodeError:# # s is non ascii byte string# return s.decode(unicode_escape)class OutputRedirector(object): Wrapper to redirect stdout or stderr def __init__(self, fp):self.fp fpdef write(self, s):self.fp.write(s)def writelines(self, lines):lines map(to_unicode, lines)self.fp.writelines(lines)def flush(self):self.fp.flush()stdout_redirector OutputRedirector(sys.stdout) stderr_redirector OutputRedirector(sys.stderr)# ---------------------------------------------------------------------- # Templateclass Template_mixin(object):Define a HTML template for report customerization and generation.Overall structure of an HTML reportHTML------------------------|html || head || || STYLESHEET || ---------------- || | | || ---------------- || || /head || || body || || HEADING || ---------------- || | | || ---------------- || || REPORT || ---------------- || | | || ---------------- || || ENDING || ---------------- || | | || ---------------- || || /body ||/html |------------------------STATUS {0: pass,1: fail,2: error,}DEFAULT_TITLE Unit Test ReportDEFAULT_DESCRIPTION # ------------------------------------------------------------------------# HTML Template HTML_TMPL r!DOCTYPE html html langzh-cnheadmeta charsetutf-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1meta http-equivContent-Type contenttext/html; charsetUTF-8/title%(title)s/titlemeta namegenerator content%(generator)s/link relstylesheet hrefhttp://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css%(stylesheet)s!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --!-- WARNING: Respond.js doesnt work if you view the page via file:// --!--[if lt IE 9]script srchttp://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js/scriptscript srchttp://cdn.bootcss.com/respond.js/1.4.2/respond.min.js/script![endif]--/head body script languagejavascript typetext/javascript!-- output_list Array();/* level - 0:Summary; 1:Failed; 2:All */ function showCase(level) {trs document.getElementsByTagName(tr);for (var i 0; i trs.length; i) {tr trs[i];id tr.id;if (id.substr(0,2) ft) {if (level 1) {tr.className hiddenRow;}else {tr.className ;}}if (id.substr(0,2) pt) {if (level 1) {tr.className ;}else {tr.className hiddenRow;}}} }function showClassDetail(cid, count) {var id_list Array(count);var toHide 1;for (var i 0; i count; i) {tid0 t cid.substr(1) . (i1);tid f tid0;tr document.getElementById(tid);if (!tr) {tid p tid0;tr document.getElementById(tid);}id_list[i] tid;if (tr.className) {toHide 0;}}for (var i 0; i count; i) {tid id_list[i];if (toHide) {document.getElementById(div_tid).style.display nonedocument.getElementById(tid).className hiddenRow;}else {document.getElementById(tid).className ;}} }function showTestDetail(div_id){var details_div document.getElementById(div_id)var displayState details_div.style.display// alert(displayState)if (displayState ! block ) {displayState blockdetails_div.style.display block}else {details_div.style.display none} }function html_escape(s) {s s.replace(//g,amp;);s s.replace(//g,lt;);s s.replace(//g,gt;);return s; }/* obsoleted by detail in div function showOutput(id, name) {var w window.open(, //urlname,resizable,scrollbars,status,width800,height450);d w.document;d.write(pre);d.write(html_escape(output_list[id]));d.write(\n);d.write(a hrefjavascript:window.close()close/a\n);d.write(/pre\n);d.close(); } */ --/scriptdiv classcontainer%(heading)s%(report)s%(ending)s /div/body /html # variables: (title, generator, stylesheet, heading, report, ending)# ------------------------------------------------------------------------# Stylesheet## alternatively use a link for external style sheet, e.g.# link relstylesheet href$url typetext/css STYLESHEET_TMPL style typetext/css mediascreen/* -- css div popup ------------------------------------------------------------------------ */ .popup_window {display: none;position: relative;left: 0px;top: 0px;/*border: solid #627173 1px; */padding: 10px;background-color: #99CCFF;font-family: Lucida Console, Courier New, Courier, monospace;text-align: left;font-size: 10pt;width: 1200px; }/* -- report ------------------------------------------------------------------------ */#show_detail_line .label {font-size: 85%;cursor: pointer; }#show_detail_line {margin: 2em auto 1em auto; }#total_row { font-weight: bold; } .hiddenRow { display: none; } .testcase { margin-left: 2em; }/style # ------------------------------------------------------------------------# Heading# HEADING_TMPL div classheading h1%(title)s/h1 %(parameters)s p classdescription%(description)s/p /div # variables: (title, parameters, description) HEADING_ATTRIBUTE_TMPL pstrong%(name)s:/strong %(value)s/p# variables: (name, value)# ------------------------------------------------------------------------# Report# REPORT_TMPL p idshow_detail_line span classlabel label-primary οnclickshowCase(0)Summary/span span classlabel label-danger οnclickshowCase(1)Failed/span span classlabel label-default οnclickshowCase(2)All/span /p table idresult_table classtabletheadtr idheader_rowthTest Group/Test case/tdthCount/tdthPass/tdthFail/tdthError/tdthView/td/tr/theadtbody%(test_list)s/tbodytfoottr idtotal_rowtdTotal/tdtd%(count)s/tdtd classtext text-success%(Pass)s/tdtd classtext text-danger%(fail)s/tdtd classtext text-warning%(error)s/tdtdnbsp;/td/tr/tfoot /table# variables: (test_list, count, Pass, fail, error) REPORT_CLASS_TMPL r tr class%(style)std%(desc)s/tdtd%(count)s/tdtd%(Pass)s/tdtd%(fail)s/tdtd%(error)s/tdtda classbtn btn-xs btn-primaryhrefjavascript:showClassDetail(%(cid)s,%(count)s)Detail/a/td /tr# variables: (style, desc, count, Pass, fail, error, cid) REPORT_TEST_WITH_OUTPUT_TMPL r tr id%(tid)s class%(Class)std class%(style)sdiv classtestcase%(desc)s/div/tdtd colspan5 aligncenter!--css div popup start--a classpopup_link btn btn-xs btn-default οnfοcusthis.blur(); hrefjavascript:showTestDetail(div_%(tid)s) %(status)s/adiv iddiv_%(tid)s classpopup_windowdiv styletext-align: right;cursor:pointera οnfοcusthis.blur(); οnclickdocument.getElementById(div_%(tid)s).style.display none [x]/a/divpre%(script)s/pre/div!--css div popup end--/td /tr# variables: (tid, Class, style, desc, status) REPORT_TEST_NO_OUTPUT_TMPL r tr id%(tid)s class%(Class)std class%(style)sdiv classtestcase%(desc)s/div/tdtd colspan5 aligncenter%(status)s/td /tr# variables: (tid, Class, style, desc, status) REPORT_TEST_OUTPUT_TMPL r %(id)s: %(output)s# variables: (id, output)# ------------------------------------------------------------------------# ENDING# ENDING_TMPL div idendingnbsp;/div# -------------------- The end of the Template class ------------------- TestResult unittest.TestResultclass _TestResult(TestResult):# note: _TestResult is a pure representation of results.# It lacks the output and reporting ability compares to unittest._TextTestResult.def __init__(self, verbosity1):TestResult.__init__(self)self.outputBuffer StringIO()self.stdout0 Noneself.stderr0 Noneself.success_count 0self.failure_count 0self.error_count 0self.verbosity verbosity# result is a list of result in 4 tuple# (# result code (0: success; 1: fail; 2: error),# TestCase object,# Test output (byte string),# stack trace,# )self.result []def startTest(self, test):TestResult.startTest(self, test)# just one buffer for both stdout and stderr 更改self.outputBuffer StringIO()stdout_redirector.fp self.outputBufferstderr_redirector.fp self.outputBufferself.stdout0 sys.stdoutself.stderr0 sys.stderrsys.stdout stdout_redirectorsys.stderr stderr_redirectordef complete_output(self):Disconnect output redirection and return buffer.Safe to call multiple times.if self.stdout0:sys.stdout self.stdout0sys.stderr self.stderr0self.stdout0 Noneself.stderr0 Nonereturn self.outputBuffer.getvalue()def stopTest(self, test):# Usually one of addSuccess, addError or addFailure would have been called.# But there are some path in unittest that would bypass this.# We must disconnect stdout in stopTest(), which is guaranteed to be called.self.complete_output()def addSuccess(self, test):self.success_count 1TestResult.addSuccess(self, test)output self.complete_output()self.result.append((0, test, output, ))if self.verbosity 1:sys.stderr.write(ok )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(.)def addError(self, test, err):self.error_count 1TestResult.addError(self, test, err)_, _exc_str self.errors[-1]output self.complete_output()self.result.append((2, test, output, _exc_str))if self.verbosity 1:sys.stderr.write(E )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(E)def addFailure(self, test, err):self.failure_count 1TestResult.addFailure(self, test, err)_, _exc_str self.failures[-1]output self.complete_output()self.result.append((1, test, output, _exc_str))if self.verbosity 1:sys.stderr.write(F )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(F)class BSTestRunner(Template_mixin):def __init__(self, streamsys.stdout, verbosity1, titleNone, descriptionNone):self.stream streamself.verbosity verbosityif title is None:self.title self.DEFAULT_TITLEelse:self.title titleif description is None:self.description self.DEFAULT_DESCRIPTIONelse:self.description descriptionself.startTime datetime.datetime.now()def run(self, test):Run the given test case or test suite.result _TestResult(self.verbosity)try:test(result)except TypeError:passself.stopTime datetime.datetime.now()self.generateReport(test, result)print(\n测试耗时: %s % (self.stopTime-self.startTime))return resultdef sortResult(self, result_list):# unittest does not seems to run in any particular order.# Here at least we want to group them together by class.rmap {}classes []for n,t,o,e in result_list:cls t.__class__if not cls in rmap:rmap[cls] []classes.append(cls)rmap[cls].append((n,t,o,e))r [(cls, rmap[cls]) for cls in classes]return rdef getReportAttributes(self, result):Return report attributes as a list of (name, value).Override this to add custom attributes.startTime str(self.startTime)[:19]duration str(self.stopTime - self.startTime)status []if result.success_count: status.append(span classtext text-successPass strong%s/strong/span % result.success_count)if result.failure_count: status.append(span classtext text-dangerFailure strong%s/strong/span % result.failure_count)if result.error_count: status.append(span classtext text-warningError strong%s/strong/span % result.error_count )if status:status .join(status)else:status nonereturn [(Start Time, startTime),(Duration, duration),(Status, status),]def generateReport(self, test, result):report_attrs self.getReportAttributes(result)generator BSTestRunner %s % __version__stylesheet self._generate_stylesheet()heading self._generate_heading(report_attrs)report self._generate_report(result)ending self._generate_ending()output self.HTML_TMPL % dict(title saxutils.escape(self.title),generator generator,stylesheet stylesheet,heading heading,report report,ending ending,)self.stream.write(output.encode(utf-8))def _generate_stylesheet(self):return self.STYLESHEET_TMPLdef _generate_heading(self, report_attrs):a_lines []for name, value in report_attrs:line self.HEADING_ATTRIBUTE_TMPL % dict(name saxutils.escape(name),####更改# value saxutils.escape(value), value value,)a_lines.append(line)heading self.HEADING_TMPL % dict(title saxutils.escape(self.title),parameters .join(a_lines),description saxutils.escape(self.description),)return headingdef _generate_report(self, result):rows []sortedResult self.sortResult(result.result)for cid, (cls, cls_results) in enumerate(sortedResult):# subtotal for a classnp nf ne 0for n,t,o,e in cls_results:if n 0: np 1elif n 1: nf 1else: ne 1# format class descriptionif cls.__module__ __main__:name cls.__name__else:name %s.%s % (cls.__module__, cls.__name__)doc cls.__doc__ and cls.__doc__.split(\n)[0] or desc doc and %s: %s % (name, doc) or namerow self.REPORT_CLASS_TMPL % dict(style ne 0 and text text-warning or nf 0 and text text-danger or text text-success,desc desc,count npnfne,Pass np,fail nf,error ne,cid c%s % (cid1),)rows.append(row)for tid, (n,t,o,e) in enumerate(cls_results):self._generate_report_test(rows, cid, tid, n, t, o, e)report self.REPORT_TMPL % dict(test_list .join(rows),count str(result.success_countresult.failure_countresult.error_count),Pass str(result.success_count),fail str(result.failure_count),error str(result.error_count),)return reportdef _generate_report_test(self, rows, cid, tid, n, t, o, e):# e.g. pt1.1, ft1.1, etchas_output bool(o or e)tid (n 0 and p or f) t%s.%s % (cid1,tid1)name t.id().split(.)[-1]doc t.shortDescription() or desc doc and (%s: %s % (name, doc)) or nametmpl has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL# o and e should be byte string because they are collected from stdout and stderr?if isinstance(o,str):# TODO: some problem with string_escape: it escape \n and mess up formating# uo unicode(o.encode(string_escape))uo oelse:uo oif isinstance(e,str):# TODO: some problem with string_escape: it escape \n and mess up formating# ue unicode(e.encode(string_escape))ue eelse:ue escript self.REPORT_TEST_OUTPUT_TMPL % dict(id tid,output saxutils.escape(uoue),)row tmpl % dict(tid tid,Class (n 0 and hiddenRow or none),# Class (n 0 and hiddenRow or text text-success),# style n 2 and errorCase or (n 1 and failCase or none),style n 2 and text text-warning or (n 1 and text text-danger or text text-success),desc desc,script script,status self.STATUS[n],)rows.append(row)if not has_output:returndef _generate_ending(self):return self.ENDING_TMPL############################################################################## # Facilities for running tests from the command line ############################################################################### Note: Reuse unittest.TestProgram to launch test. In the future we may # build our own launcher to support more specific command line # parameters like test title, CSS, etc. class TestProgram(unittest.TestProgram):A variation of the unittest.TestProgram. Please refer to the baseclass for command line parameters.def runTests(self):# Pick BSTestRunner as the default test runner.# base classs testRunner parameter is not useful because it means# we have to instantiate BSTestRunner before we know self.verbosity.if self.testRunner is None:self.testRunner BSTestRunner(verbosityself.verbosity)unittest.TestProgram.runTests(self)main TestProgram############################################################################## # Executing this module from the command line ##############################################################################if __name__ __main__:main(moduleNone) View Code 还有一个HTMLTestRunner 支持python3 代码如下  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 unittestimport HTMLTestRunner... define your tests ...if __name__ __main__:HTMLTestRunner.main()For more customization options, instantiates a HTMLTestRunner object. HTMLTestRunner is a counterpart to unittests TextTestRunner. E.g.# output to a filefp file(my_report.html, wb)runner HTMLTestRunner.HTMLTestRunner(streamfp,titleMy unit test,descriptionThis demonstrates the report output by HTMLTestRunner.)# Use an external stylesheet.# See the Template_mixin class for more customizable optionsrunner.STYLESHEET_TMPL link relstylesheet hrefmy_stylesheet.css typetext/css# run the testrunner.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 copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution. * Neither the name Wai Yip Tung nor the names of its contributors may beused to endorse or promote products derived from this software withoutspecific 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__author__ Wai Yip Tung __version__ 0.8.2 Change HistoryVersion 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 script block as CDATA.Version in 0.7.1 * Back port to Python 2.3 (Frank Horowitz). * Fix missing scroll bars in detail log (Podi). # TODO: color stderr # TODO: simplify javascript using ,ore than 1 class in the class attribute?import datetime import io import sys import time import unittest from xml.sax import saxutils# ------------------------------------------------------------------------ # The redirectors below are used to capture output during testing. Output # sent to sys.stdout and sys.stderr are automatically captured. However # in some cases sys.stdout is already cached before HTMLTestRunner is # invoked (e.g. calling logging.basicConfig). In order to capture those # output, use the redirectors for the cached stream. # # e.g. # logging.basicConfig(streamHTMLTestRunner.stdout_redirector) # class OutputRedirector(object): Wrapper to redirect stdout or stderr def __init__(self, fp):self.fp fpdef write(self, s):self.fp.write(s)def writelines(self, lines):self.fp.writelines(lines)def flush(self):self.fp.flush()stdout_redirector OutputRedirector(sys.stdout) stderr_redirector OutputRedirector(sys.stderr)# ---------------------------------------------------------------------- # Templateclass Template_mixin(object):Define a HTML template for report customerization and generation.Overall structure of an HTML reportHTML------------------------|html || head || || STYLESHEET || ---------------- || | | || ---------------- || || /head || || body || || HEADING || ---------------- || | | || ---------------- || || REPORT || ---------------- || | | || ---------------- || || ENDING || ---------------- || | | || ---------------- || || /body ||/html |------------------------STATUS {0: pass,1: fail,2: error,}DEFAULT_TITLE Unit Test ReportDEFAULT_DESCRIPTION # ------------------------------------------------------------------------# HTML Template HTML_TMPL r?xml version1.0 encodingUTF-8? !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd html xmlnshttp://www.w3.org/1999/xhtml headtitle%(title)s/titlemeta namegenerator content%(generator)s/meta http-equivContent-Type contenttext/html; charsetUTF-8/%(stylesheet)s /head body script languagejavascript typetext/javascript!-- output_list Array();/* level - 0:Summary; 1:Failed; 2:All */ function showCase(level) {trs document.getElementsByTagName(tr);for (var i 0; i trs.length; i) {tr trs[i];id tr.id;if (id.substr(0,2) ft) {if (level 1) {tr.className hiddenRow;}else {tr.className ;}}if (id.substr(0,2) pt) {if (level 1) {tr.className ;}else {tr.className hiddenRow;}}} }function showClassDetail(cid, count) {var id_list Array(count);var toHide 1;for (var i 0; i count; i) {tid0 t cid.substr(1) . (i1);tid f tid0;tr document.getElementById(tid);if (!tr) {tid p tid0;tr document.getElementById(tid);}id_list[i] tid;if (tr.className) {toHide 0;}}for (var i 0; i count; i) {tid id_list[i];if (toHide) {document.getElementById(div_tid).style.display nonedocument.getElementById(tid).className hiddenRow;}else {document.getElementById(tid).className ;}} }function showTestDetail(div_id){var details_div document.getElementById(div_id)var displayState details_div.style.display// alert(displayState)if (displayState ! block ) {displayState blockdetails_div.style.display block}else {details_div.style.display none} }function html_escape(s) {s s.replace(//g,amp;);s s.replace(//g,lt;);s s.replace(//g,gt;);return s; }/* obsoleted by detail in div function showOutput(id, name) {var w window.open(, //urlname,resizable,scrollbars,status,width800,height450);d w.document;d.write(pre);d.write(html_escape(output_list[id]));d.write(\n);d.write(a hrefjavascript:window.close()close/a\n);d.write(/pre\n);d.close(); } */ --/script%(heading)s %(report)s %(ending)s/body /html # variables: (title, generator, stylesheet, heading, report, ending)# ------------------------------------------------------------------------# Stylesheet## alternatively use a link for external style sheet, e.g.# link relstylesheet href$url typetext/css STYLESHEET_TMPL style typetext/css mediascreen body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; } table { font-size: 100%; } pre { }/* -- heading ---------------------------------------------------------------------- */ h1 {font-size: 16pt;color: gray; } .heading {margin-top: 0ex;margin-bottom: 1ex; }.heading .attribute {margin-top: 1ex;margin-bottom: 0; }.heading .description {margin-top: 4ex;margin-bottom: 6ex; }/* -- css div popup ------------------------------------------------------------------------ */ a.popup_link { }a.popup_link:hover {color: red; }.popup_window {display: none;position: relative;left: 0px;top: 0px;/*border: solid #627173 1px; */padding: 10px;background-color: #E6E6D6;font-family: Lucida Console, Courier New, Courier, monospace;text-align: left;font-size: 8pt;width: 500px; }} /* -- report ------------------------------------------------------------------------ */ #show_detail_line {margin-top: 3ex;margin-bottom: 1ex; } #result_table {width: 80%;border-collapse: collapse;border: 1px solid #777; } #header_row {font-weight: bold;color: white;background-color: #777; } #result_table td {border: 1px solid #777;padding: 2px; } #total_row { font-weight: bold; } .passClass { background-color: #6c6; } .failClass { background-color: #c60; } .errorClass { background-color: #c00; } .passCase { color: #6c6; } .failCase { color: #c60; font-weight: bold; } .errorCase { color: #c00; font-weight: bold; } .hiddenRow { display: none; } .testcase { margin-left: 2em; }/* -- ending ---------------------------------------------------------------------- */ #ending { }/style # ------------------------------------------------------------------------# Heading# HEADING_TMPL div classheading h1%(title)s/h1 %(parameters)s p classdescription%(description)s/p /div # variables: (title, parameters, description) HEADING_ATTRIBUTE_TMPL p classattributestrong%(name)s:/strong %(value)s/p# variables: (name, value)# ------------------------------------------------------------------------# Report# REPORT_TMPL p idshow_detail_line显示 a hrefjavascript:showCase(0)总数/a a hrefjavascript:showCase(1)失败/a a hrefjavascript:showCase(2)所有/a /p table idresult_table colgroup col alignleft / col alignright / col alignright / col alignright / col alignright / col alignright / /colgroup tr idheader_rowtd测试组/测试用例/tdtd数量/tdtd通过/tdtd失败/tdtd错误/tdtd查看/td /tr %(test_list)s tr idtotal_rowtd总共/tdtd%(count)s/tdtd%(Pass)s/tdtd%(fail)s/tdtd%(error)s/tdtdnbsp;/td /tr /table# variables: (test_list, count, Pass, fail, error) REPORT_CLASS_TMPL r tr class%(style)std%(desc)s/tdtd%(count)s/tdtd%(Pass)s/tdtd%(fail)s/tdtd%(error)s/tdtda hrefjavascript:showClassDetail(%(cid)s,%(count)s)Detail/a/td /tr# variables: (style, desc, count, Pass, fail, error, cid) REPORT_TEST_WITH_OUTPUT_TMPL r tr id%(tid)s class%(Class)std class%(style)sdiv classtestcase%(desc)s/div/tdtd colspan5 aligncenter!--css div popup start--a classpopup_link οnfοcusthis.blur(); hrefjavascript:showTestDetail(div_%(tid)s) %(status)s/adiv iddiv_%(tid)s classpopup_windowdiv styletext-align: right; color:red;cursor:pointera οnfοcusthis.blur(); οnclickdocument.getElementById(div_%(tid)s).style.display none [x]/a/divpre%(script)s/pre/div!--css div popup end--/td /tr# variables: (tid, Class, style, desc, status) REPORT_TEST_NO_OUTPUT_TMPL r tr id%(tid)s class%(Class)std class%(style)sdiv classtestcase%(desc)s/div/tdtd colspan5 aligncenter%(status)s/td /tr# variables: (tid, Class, style, desc, status) REPORT_TEST_OUTPUT_TMPL r %(id)s: %(output)s# variables: (id, output)# ------------------------------------------------------------------------# ENDING# ENDING_TMPL div idendingnbsp;/div# -------------------- The end of the Template class ------------------- TestResult unittest.TestResultclass _TestResult(TestResult):# note: _TestResult is a pure representation of results.# It lacks the output and reporting ability compares to unittest._TextTestResult.def __init__(self, verbosity1):TestResult.__init__(self)self.stdout0 Noneself.stderr0 Noneself.success_count 0self.failure_count 0self.error_count 0self.verbosity verbosity# result is a list of result in 4 tuple# (# result code (0: success; 1: fail; 2: error),# TestCase object,# Test output (byte string),# stack trace,# )self.result []def startTest(self, test):TestResult.startTest(self, test)# just one buffer for both stdout and stderrself.outputBuffer io.StringIO()stdout_redirector.fp self.outputBufferstderr_redirector.fp self.outputBufferself.stdout0 sys.stdoutself.stderr0 sys.stderrsys.stdout stdout_redirectorsys.stderr stderr_redirectordef complete_output(self):Disconnect output redirection and return buffer.Safe to call multiple times.if self.stdout0:sys.stdout self.stdout0sys.stderr self.stderr0self.stdout0 Noneself.stderr0 Nonereturn self.outputBuffer.getvalue()def stopTest(self, test):# Usually one of addSuccess, addError or addFailure would have been called.# But there are some path in unittest that would bypass this.# We must disconnect stdout in stopTest(), which is guaranteed to be called.self.complete_output()def addSuccess(self, test):self.success_count 1TestResult.addSuccess(self, test)output self.complete_output()self.result.append((0, test, output, ))if self.verbosity 1:sys.stderr.write(ok )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(.)def addError(self, test, err):self.error_count 1TestResult.addError(self, test, err)_, _exc_str self.errors[-1]output self.complete_output()self.result.append((2, test, output, _exc_str))if self.verbosity 1:sys.stderr.write(E )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(E)def addFailure(self, test, err):self.failure_count 1TestResult.addFailure(self, test, err)_, _exc_str self.failures[-1]output self.complete_output()self.result.append((1, test, output, _exc_str))if self.verbosity 1:sys.stderr.write(F )sys.stderr.write(str(test))sys.stderr.write(\n)else:sys.stderr.write(F)class HTMLTestRunner(Template_mixin):def __init__(self, streamsys.stdout, verbosity1, titleNone, descriptionNone):self.stream streamself.verbosity verbosityif title is None:self.title self.DEFAULT_TITLEelse:self.title titleif description is None:self.description self.DEFAULT_DESCRIPTIONelse:self.description descriptionself.startTime datetime.datetime.now()def run(self, test):Run the given test case or test suite.result _TestResult(self.verbosity)test(result)self.stopTime datetime.datetime.now()self.generateReport(test, result)# print sys.stderr, \nTime Elapsed: %s % (self.stopTime-self.startTime)print(sys.stderr, \nTime Elapsed: %s % (self.stopTime-self.startTime))return resultdef sortResult(self, result_list):# unittest does not seems to run in any particular order.# Here at least we want to group them together by class.rmap {}classes []for n,t,o,e in result_list:cls t.__class__if not cls in rmap:rmap[cls] []classes.append(cls)rmap[cls].append((n,t,o,e))r [(cls, rmap[cls]) for cls in classes]return rdef getReportAttributes(self, result):Return report attributes as a list of (name, value).Override this to add custom attributes.startTime str(self.startTime)[:19]duration str(self.stopTime - self.startTime)status []if result.success_count: status.append(Pass %s % result.success_count)if result.failure_count: status.append(Failure %s % result.failure_count)if result.error_count: status.append(Error %s % result.error_count )if status:status .join(status)else:status nonereturn [(开始时间, startTime),(耗时, duration),(结果, status),]def generateReport(self, test, result):report_attrs self.getReportAttributes(result)generator HTMLTestRunner %s % __version__stylesheet self._generate_stylesheet()heading self._generate_heading(report_attrs)report self._generate_report(result)ending self._generate_ending()output self.HTML_TMPL % dict(title saxutils.escape(self.title),generator generator,stylesheet stylesheet,heading heading,report report,ending ending,)self.stream.write(output.encode(utf8))def _generate_stylesheet(self):return self.STYLESHEET_TMPLdef _generate_heading(self, report_attrs):a_lines []for name, value in report_attrs:line self.HEADING_ATTRIBUTE_TMPL % dict(name saxutils.escape(name),value saxutils.escape(value),)a_lines.append(line)heading self.HEADING_TMPL % dict(title saxutils.escape(self.title),parameters .join(a_lines),description saxutils.escape(self.description),)return headingdef _generate_report(self, result):rows []sortedResult self.sortResult(result.result)for cid, (cls, cls_results) in enumerate(sortedResult):# subtotal for a classnp nf ne 0for n,t,o,e in cls_results:if n 0: np 1elif n 1: nf 1else: ne 1# format class descriptionif cls.__module__ __main__:name cls.__name__else:name %s.%s % (cls.__module__, cls.__name__)doc cls.__doc__ and cls.__doc__.split(\n)[0] or desc doc and %s: %s % (name, doc) or namerow self.REPORT_CLASS_TMPL % dict(style ne 0 and errorClass or nf 0 and failClass or passClass,desc desc,count npnfne,Pass np,fail nf,error ne,cid c%s % (cid1),)rows.append(row)for tid, (n,t,o,e) in enumerate(cls_results):self._generate_report_test(rows, cid, tid, n, t, o, e)report self.REPORT_TMPL % dict(test_list .join(rows),count str(result.success_countresult.failure_countresult.error_count),Pass str(result.success_count),fail str(result.failure_count),error str(result.error_count),)return reportdef _generate_report_test(self, rows, cid, tid, n, t, o, e):# e.g. pt1.1, ft1.1, etchas_output bool(o or e)tid (n 0 and p or f) t%s.%s % (cid1,tid1)name t.id().split(.)[-1]doc t.shortDescription() or desc doc and (%s: %s % (name, doc)) or nametmpl has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL# o and e should be byte string because they are collected from stdout and stderr?if isinstance(o,str):# TODO: some problem with string_escape: it escape \n and mess up formating# uo unicode(o.encode(string_escape))# uo o.decode(latin-1)uo eelse:uo oif isinstance(e,str):# TODO: some problem with string_escape: it escape \n and mess up formating# ue unicode(e.encode(string_escape))# ue e.decode(latin-1)ue eelse:ue escript self.REPORT_TEST_OUTPUT_TMPL % dict(id tid,output saxutils.escape(str(uo)ue),)row tmpl % dict(tid tid,Class (n 0 and hiddenRow or none),style n 2 and errorCase or (n 1 and failCase or none),desc desc,script script,status self.STATUS[n],)rows.append(row)if not has_output:returndef _generate_ending(self):return self.ENDING_TMPL############################################################################## # Facilities for running tests from the command line ############################################################################### Note: Reuse unittest.TestProgram to launch test. In the future we may # build our own launcher to support more specific command line # parameters like test title, CSS, etc. class TestProgram(unittest.TestProgram):A variation of the unittest.TestProgram. Please refer to the baseclass for command line parameters.def runTests(self):# Pick HTMLTestRunner as the default test runner.# base classs testRunner parameter is not useful because it means# we have to instantiate HTMLTestRunner before we know self.verbosity.if self.testRunner is None:self.testRunner HTMLTestRunner(verbosityself.verbosity)unittest.TestProgram.runTests(self)main TestProgram############################################################################## # Executing this module from the command line ##############################################################################if __name__ __main__:main(moduleNone) View Code  转载于:https://www.cnblogs.com/leiziv5/p/7489134.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

济南网站建设cnwenhui银行网站模板免费下载

<locale.h>提供的函数用于控制c标准库中对于不同的地区行为不一样的部分。&#xff08;地区通常是国家或者某种特定语言的地理区域&#xff09; 在标准库里&#xff0c;依赖地区的部分通常包括以下几项&#xff1a; 数字量的格式 货币的格式 字符集 时间日期的格式 它设…

做网站湖州邯郸市建设局查中级职称网站

现在&#xff0c;许多Spark应用程序已成为遗留应用程序&#xff0c;很难在本地进行增强&#xff0c;测试和运行。 Spark具有很好的测试支持&#xff0c;但仍有许多Spark应用程序不可测试。 当您尝试运行一些旧的Spark应用程序时&#xff0c;我将分享一个常见错误。 Exceptio…

怎么建设营销型网站自适应网站什么意思

一、Hive开窗函数根据特定条件取上一条最接近时间的数据&#xff08;单个开窗函数&#xff0c;实际取两个窗口&#xff09; 针对于就诊业务&#xff0c;一次就诊&#xff0c;多个处方&#xff0c;处方结算时间可能不一致&#xff0c;然后会有多个AI助手推荐用药&#xff0c;会…

北京定制网站开发公司网站推广需要多少钱

在本系列内容第1部分和第2部分中分别介绍了使用DSC法通过间接法测量材料的比热容的常用方法的基本原理和得到高质量比热数据的方法&#xff0c;在完成实验后需要在相关的分析软件中计算所研究的材料的比热容。在目前大多数商品化的DSC仪所附带的分析软件中通常可以额外配置可用…

建设手机网站包括哪些费用吗做淘宝客优惠券网站还是APP赚钱

ER TO SQL语句的转换&#xff0c;在数据库设计生命周期的位置如下所示。 一、转换的类别 从ER图转化得到关系数据库中的SQL表&#xff0c;一般可分为3类&#xff1a; 1&#xff09;转化得到的SQL表与原始实体包含相同信息内容。该类转化一般适用于&#xff1a; 二元“多对多”关…

策划方案免费网站南京广告公司排名

在Java中&#xff0c;Async注解通常与Spring框架一起使用以实现异步方法调用。然而&#xff0c;CompletableFuture.runAsync()是Java标准库中的方法&#xff0c;并不受Async注解的影响。 Async注解只能被Spring容器识别和处理&#xff0c;因此只能在由Spring管理的组件&#x…

织梦做网站简单吗企业策划书3000字

1.概述 封装&#xff08;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问。 要访问该类的代码和数据&#xff0c;必须通过严格的接口控制…

网站做加qq群链接地址wordpress删除评论框

基于被囊群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于被囊群算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于被囊群优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

青岛网站建设eoe网上商城推广方法

应用变现平台是帮助开发者优化广告策略并最终获得更多收入的综合途径。在广告变现过程中&#xff0c;接入单一的广告联盟&#xff0c;变现效率不高&#xff0c;并且开发者需要花费许多精力进行筛选和管理&#xff0c;难免会应接不暇&#xff0c;而聚合广告平台的出现则一定程度…

黑龙江门户网站建设注册公司的流程图

2024年智慧城市与信息系统国际学术会议 (ICSCIS 2024) 2024 International Conference on Smart City and Information System 随着互联网技术的发展&#xff0c;城市化进程的深入&#xff0c;智慧城市的研究与发展越来越普遍&#xff0c;运用物联网、云计算、大数据等先进信…

中职省级示范校建设网站百度快速收录seo工具软件

文章目录 1. 认识线程死锁2. 如何避免线程死锁? 1. 认识线程死锁 线程死锁描述的是这样一种情况&#xff1a;多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 如下图所示&#xff…

2025.9.23

今天早八去科技楼上工程实训课,主要是电工技能,比如学习万用表测电笔的使用以及体验安全电流穿过人体的感觉。然后写实验报告记录过程和感想。下课后去勒泰中心5楼吃了自助烤肉两个小时,还是烤肉,火鸡面,薯条,桂…

软件工程学习日志2025.9.23

我的 HBase 故障排查日记:从绝望到成功的一天 今天是我与 HBase 斗争的一天,也是一次从挫折到突破的技术之旅。早上当我尝试启动 HBase 时,遭遇了一系列令人困惑的问题,最终通过系统性的排查找到了解决方案。 问题…

长春免费网站制作百度网盘app下载安装电脑版

写在开头FreeSql 是 .NET 开源生态下的 ORM 轮子&#xff0c;转眼快两年了&#xff0c;说真的开源不容易&#xff08;只有经历过才明白&#xff09;。今天带点干货和湿货给大家&#xff0c;先说下湿货。认识我的人&#xff0c;知道 CSRedisCore 是我写的另外一个开源组件&#…

dede网站文章同步网站开发和网络工程师

会员经济俨然成为消费领域的“香饽饽”。 听歌、看视频、购物甚至出行&#xff0c;三百六十行&#xff0c;行行有会员。 本质上&#xff0c;“会员”是商家与消费者之间的“信任关系”&#xff0c;消费者愿意相信商家会让渡更多实惠与便利&#xff1b;商家则希望通过让利换取…

电信网站备案流程图wordpress 来必力

1 迭代Iteration 迭代Iteration&#xff1a;所谓迭代就是重复运行一段代码语句块的能力&#xff0c;就好比在一个容器中进行一层一层遍历数据&#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素&#xff0c;直到容器中没有元素为止。迭代迭代&…

做网站要学会什么软件微信头像定制软件

Static修饰成员变量 Static是什么 叫静态&#xff0c;可以修饰成员变量&#xff0c;成员方法 成员变量按有无static修饰分俩种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机里只有一份&#xff0c;会被类的全部对…

网站建设家乡网页设计模板零元创业加盟网

作者:CSDN @ _养乐多_ 本博客将向您介绍如何使用Google Earth Engine(GEE)平台来处理Landsat 5、7和8的卫星图像数据,计算NDVI的斜率和截距,以及如何导出这些结果供进一步分析使用。 文章目录 一、代码详解1.1 核心代码详解1.2 核心代码详解1.3 代码框架介绍二、完整代码…

江门搜狗网站推广优化html5 图片网站

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot对于如何使用Spring构建应用程序有一个看法&#xff1a;例如它具有常规配置文件的常规位置&#xff0c;以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上&#xff0c;并添加了一些可能系统中所有…

已收录的网站不好优化白云区江夏附近做网站

前言 项目进行到新的一个迭代了&#xff0c;赶了1周需求&#xff0c;接口终于处理完了。分享记录下迭代中处理导入、导出、下载模版功能的细节吧。 一、场景 EasyExcel&#xff08;阿里&#xff09;实现Excel数据处理三层表头&#xff0c;第二、三层表头动态数据根据第二、三层…