报告目录结构

Reporter根目录

|-------------LOGS

|                                                |

|                                         2017-09-21_12-34-39   每次按日期时间动态生成报告目录

|                                                |

|                                             Image   用于存储每个功能点,验证截图,这个会显示在报告上

|--- LOG.XSLT  #报告样式及格式

1、使用xslt,来设定样式

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5. <xsl:template match="/">
  6. <html>
  7. <Head>
  8. <style type="text/css">
  9.  
  10. body {
  11. background:#fff;
  12. margin:0;
  13. padding:40px 20px;
  14. font-family: "Arial", Arial, Sans-serif;
  15. font-size: 16px;
  16. color:#000;
  17. }
  18.  
  19. table {
  20. margin:5px 5px 0;
  21. border:0px solid #222;
  22. font-size: 0.8em;
  23. }
  24.  
  25. td {
  26. margin:5px 5px 0;
  27. padding:10px 10px 10px 10px;
  28. vertical-align:text-top;
  29. border:1px solid #222;
  30. border-width:1px 1px 1px 1px;
  31. }
  32.  
  33. td.light {
  34. border:0px solid #222;
  35. }
  36.  
  37. td.number {
  38. text-align:right;
  39. }
  40.  
  41. td.status {
  42. text-align:right;
  43. vertical-align:text-bottom;
  44. }
  45.  
  46. </style>
  47.  
  48. </Head>
  49. <body>
  50. <!--OVER RESULT -->
  51. <xsl:variable name="OVER_STATUS" select="REPORT/OVER_STATUS"/>
  52. <xsl:variable name="STATUS" select="REPORT/LOG_ENTRY/STATUS"/>
  53.  
  54. <h2>自动化测试执行报告</h2>
  55. <!--table -->
  56. <table border="1">
  57. <!--all result value-->
  58. <tr bgcolor="white" height = "35">
  59. <td>Overall Test Result</td>
  60. <td><xsl:value-of select="$OVER_STATUS"/></td>
  61. <td colspan="8"> </td>
  62. </tr>
  63.  
  64. <tr bgcolor="#D8BFD9" height = "35">
  65. <th>Step</th>
  66. <th>Execute Time</th>
  67. <th>Step Result</th>
  68. <th>Description</th>
  69. <th>Step Description</th>
  70. <th>Action</th>
  71. <th>Index</th>
  72. <th>Element</th>
  73. <th>Value</th>
  74. <th>Expected Results </th>
  75. </tr>
  76.  
  77. <!--select font color -->
  78. <xsl:variable name="fontColor">
  79. <xsl:choose>
  80. <xsl:when test="$STATUS = FAILED or $STATUS = PASSED">
  81. <xsl:text>white</xsl:text>
  82. </xsl:when>
  83. <xsl:otherwise>black</xsl:otherwise>
  84. </xsl:choose>
  85. </xsl:variable>
  86.  
  87. <!-- Compute the background color according to the overall test result -->
  88. <xsl:variable name="StatusBackgroundColor">
  89. <xsl:choose>
  90. <xsl:when test="$STATUS = 'FAILED'">
  91. <!--<xsl:text>rgb(158, 48, 57)</xsl:text> -->
  92. <xsl:text>rgb(255, 40, 38)</xsl:text>
  93. </xsl:when>
  94. <xsl:when test="$STATUS = 'WARNING'">
  95. <xsl:text>rgb(132, 76, 84)</xsl:text>
  96. </xsl:when>
  97. <xsl:when test="$STATUS = 'PASSED'">
  98. <xsl:text>rgb(121, 180, 112)</xsl:text>
  99. </xsl:when>
  100. <xsl:when test="$STATUS = 'DONE'">
  101. <xsl:text>white</xsl:text>
  102. </xsl:when>
  103. <xsl:when test="$STATUS = 'INFO'">
  104. <xsl:text>white</xsl:text>
  105. </xsl:when>
  106. <xsl:otherwise>
  107. <xsl:text>white</xsl:text>
  108. </xsl:otherwise>
  109. </xsl:choose>
  110. </xsl:variable>
  111.  
  112. <!--log entry-->
  113. <xsl:for-each select = "REPORT/LOG_ENTRY">
  114.  
  115. <tr>
  116. <td><xsl:value-of select="STEP"/></td>
  117. <td><xsl:value-of select="EXECUTION_TIME"/></td>
  118. <td bgcolor="{$StatusBackgroundColor}"><xsl:value-of select="STEP_RESULT"/></td>
  119. <td><xsl:value-of select="DESCRIPTION"/></td>
  120. <td><xsl:value-of select="STEP_DESCRIPTION"/></td>
  121. <td><xsl:value-of select="ACTION"/></td>
  122. <td><xsl:value-of select="INDEX"/></td>
  123. <td><xsl:value-of select="ELEMENT"/></td>
  124. <td><xsl:value-of select="VALUE"/></td>
  125. <td><xsl:value-of select="EXPECTED_RESULTS"/></td>
  126. </tr>
  127. <!-- Store image path -->
  128. <xsl:variable name="Image">
  129. <xsl:value-of select="IMAGE_PATH"/>
  130. </xsl:variable>
  131. <!-- If XML contains an image path then display it according to the following -->
  132. <xsl:choose>
  133. <xsl:when test="normalize-space($Image)!=''">
  134. <!-- Comment the Next line to Stop showing embedded image in log and change the width number to make image size change-->
  135. <tr>
  136. <td colspan="10">
  137. <a href="{$Image}" target="_blank" >
  138. <img src="{$Image}" width="300"></img>
  139. </a>
  140. </td>
  141. </tr>
  142. </xsl:when>
  143. </xsl:choose>
  144. </xsl:for-each>
  145.  
  146. <tr bgcolor="white">
  147. <font color="{$fontColor}">
  148. <td colspan="10">Overall Test Result: <xsl:value-of select="$OVER_STATUS"/></td>
  149. </font>
  150. </tr>
  151. </table>
  152. </body>
  153. </html>
  154. </xsl:template>
  155. </xsl:stylesheet>

2、生成xml报告(python代码会自动生成)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml-stylesheet href="../../LOG.XSLT" type="text/xsl"?>
  3. <REPORT>
  4. <OVER_STATUS>PASSED</OVER_STATUS>
  5. <LOG_ENTRY>
  6. <STATUS>PASSED</STATUS>
  7. <STEP>2</STEP>
  8. <EXECUTION_TIME>2017-09-21_12-34-47</EXECUTION_TIME>
  9. <STEP_RESULT>PASSED</STEP_RESULT>
  10. <DESCRIPTION>普惠家登录</DESCRIPTION>
  11. <STEP_DESCRIPTION>输入'用户名'</STEP_DESCRIPTION>
  12. <ACTION>input</ACTION>
  13. <INDEX>By.XPATH</INDEX>
  14. <ELEMENT>//Input[@id='userName']</ELEMENT>
  15. <VALUE>msh195</VALUE>
  16. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  17. <IMAGE_PATH></IMAGE_PATH>
  18. </LOG_ENTRY>
  19. <LOG_ENTRY>
  20. <STATUS>PASSED</STATUS>
  21. <STEP>3</STEP>
  22. <EXECUTION_TIME>2017-09-21_12-34-48</EXECUTION_TIME>
  23. <STEP_RESULT>PASSED</STEP_RESULT>
  24. <DESCRIPTION></DESCRIPTION>
  25. <STEP_DESCRIPTION>输入'密码'</STEP_DESCRIPTION>
  26. <ACTION>input</ACTION>
  27. <INDEX>By.XPATH</INDEX>
  28. <ELEMENT>//Input[@id='password']</ELEMENT>
  29. <VALUE>112233</VALUE>
  30. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  31. <IMAGE_PATH></IMAGE_PATH>
  32. </LOG_ENTRY>
  33. <LOG_ENTRY>
  34. <STATUS>PASSED</STATUS>
  35. <STEP>4</STEP>
  36. <EXECUTION_TIME>2017-09-21_12-34-56</EXECUTION_TIME>
  37. <STEP_RESULT>PASSED</STEP_RESULT>
  38. <DESCRIPTION></DESCRIPTION>
  39. <STEP_DESCRIPTION>单击'立即登录'</STEP_DESCRIPTION>
  40. <ACTION>click</ACTION>
  41. <INDEX>By.LINK_TEXT</INDEX>
  42. <ELEMENT>立即登录</ELEMENT>
  43. <VALUE></VALUE>
  44. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  45. <IMAGE_PATH></IMAGE_PATH>
  46. </LOG_ENTRY>
  47. <LOG_ENTRY>
  48. <STATUS>PASSED</STATUS>
  49. <STEP>5</STEP>
  50. <EXECUTION_TIME>2017-09-21_12-34-56</EXECUTION_TIME>
  51. <STEP_RESULT>PASSED</STEP_RESULT>
  52. <DESCRIPTION></DESCRIPTION>
  53. <STEP_DESCRIPTION>‘我的帐户’是否存在</STEP_DESCRIPTION>
  54. <ACTION>verify</ACTION>
  55. <INDEX>By.LINK_TEXT</INDEX>
  56. <ELEMENT>我的账户</ELEMENT>
  57. <VALUE></VALUE>
  58. <EXPECTED_RESULTS>登录成功,显示登录后页面</EXPECTED_RESULTS>
  59. <IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-34-56.png</IMAGE_PATH>
  60. </LOG_ENTRY>
  61. <LOG_ENTRY>
  62. <STATUS>PASSED</STATUS>
  63. <STEP>6</STEP>
  64. <EXECUTION_TIME>2017-09-21_12-34-59</EXECUTION_TIME>
  65. <STEP_RESULT>PASSED</STEP_RESULT>
  66. <DESCRIPTION>正常充值</DESCRIPTION>
  67. <STEP_DESCRIPTION>单击'充值'</STEP_DESCRIPTION>
  68. <ACTION>click</ACTION>
  69. <INDEX>By.XPATH</INDEX>
  70. <ELEMENT>//div[@class='account_center_tips_div_4 fl']/input</ELEMENT>
  71. <VALUE></VALUE>
  72. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  73. <IMAGE_PATH></IMAGE_PATH>
  74. </LOG_ENTRY>
  75. <LOG_ENTRY>
  76. <STATUS>PASSED</STATUS>
  77. <STEP>7</STEP>
  78. <EXECUTION_TIME>2017-09-21_12-34-59</EXECUTION_TIME>
  79. <STEP_RESULT>PASSED</STEP_RESULT>
  80. <DESCRIPTION></DESCRIPTION>
  81. <STEP_DESCRIPTION>‘充值记录’是否存在</STEP_DESCRIPTION>
  82. <ACTION>verify</ACTION>
  83. <INDEX>By.LINK_TEXT</INDEX>
  84. <ELEMENT>充值记录</ELEMENT>
  85. <VALUE></VALUE>
  86. <EXPECTED_RESULTS>进入'充值页面',存在充值记录链接</EXPECTED_RESULTS>
  87. <IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-34-59.png</IMAGE_PATH>
  88. </LOG_ENTRY>
  89. <LOG_ENTRY>
  90. <STATUS>PASSED</STATUS>
  91. <STEP>8</STEP>
  92. <EXECUTION_TIME>2017-09-21_12-35-00</EXECUTION_TIME>
  93. <STEP_RESULT>PASSED</STEP_RESULT>
  94. <DESCRIPTION></DESCRIPTION>
  95. <STEP_DESCRIPTION>选择‘充值方式'绑定支付</STEP_DESCRIPTION>
  96. <ACTION>click</ACTION>
  97. <INDEX>By.ID</INDEX>
  98. <ELEMENT>rapid</ELEMENT>
  99. <VALUE></VALUE>
  100. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  101. <IMAGE_PATH></IMAGE_PATH>
  102. </LOG_ENTRY>
  103. <LOG_ENTRY>
  104. <STATUS>PASSED</STATUS>
  105. <STEP>9</STEP>
  106. <EXECUTION_TIME>2017-09-21_12-35-02</EXECUTION_TIME>
  107. <STEP_RESULT>PASSED</STEP_RESULT>
  108. <DESCRIPTION></DESCRIPTION>
  109. <STEP_DESCRIPTION>输入‘金额’</STEP_DESCRIPTION>
  110. <ACTION>input</ACTION>
  111. <INDEX>By.ID</INDEX>
  112. <ELEMENT>recharge_money</ELEMENT>
  113. <VALUE>100</VALUE>
  114. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  115. <IMAGE_PATH></IMAGE_PATH>
  116. </LOG_ENTRY>
  117. <LOG_ENTRY>
  118. <STATUS>PASSED</STATUS>
  119. <STEP>10</STEP>
  120. <EXECUTION_TIME>2017-09-21_12-35-03</EXECUTION_TIME>
  121. <STEP_RESULT>PASSED</STEP_RESULT>
  122. <DESCRIPTION></DESCRIPTION>
  123. <STEP_DESCRIPTION>单击‘确认充值’</STEP_DESCRIPTION>
  124. <ACTION>click</ACTION>
  125. <INDEX>By.LINK_TEXT</INDEX>
  126. <ELEMENT>确认充值</ELEMENT>
  127. <VALUE></VALUE>
  128. <EXPECTED_RESULTS></EXPECTED_RESULTS>
  129. <IMAGE_PATH></IMAGE_PATH>
  130. </LOG_ENTRY>
  131. <LOG_ENTRY>
  132. <STATUS>PASSED</STATUS>
  133. <STEP>11</STEP>
  134. <EXECUTION_TIME>2017-09-21_12-35-05</EXECUTION_TIME>
  135. <STEP_RESULT>PASSED</STEP_RESULT>
  136. <DESCRIPTION></DESCRIPTION>
  137. <STEP_DESCRIPTION>充值结果'对话框是否存在</STEP_DESCRIPTION>
  138. <ACTION>verify</ACTION>
  139. <INDEX>By.LINK_TEXT</INDEX>
  140. <ELEMENT>充值完成</ELEMENT>
  141. <VALUE></VALUE>
  142. <EXPECTED_RESULTS>弹出'充值结果'对话框,存在充值完成链接</EXPECTED_RESULTS>
  143. <IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-35-05.png</IMAGE_PATH>
  144. </LOG_ENTRY>
  145. </REPORT>

3、python生成报告代码

  1. #*_*coding:utf-8*_*
  2.  
  3. import xml.dom.minidom as xmlDoc
  4. import os
  5. import gl
  6. import sys
  7. import time
  8.  
  9. class cREPORTXML(object):
  10. def __init__(self):
  11. self.__struct = self.createReportNode()
  12.  
  13. #创建report节点
  14. def createReportNode(self):
  15. try:
  16. xmlD = xmlDoc.Document()
  17.  
  18. #xml样式
  19. xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"../../LOG.XSLT\" type=\"text/xsl\"")
  20. xmlD.appendChild(xlstNode)
  21.  
  22. report = xmlD.createElement('REPORT')
  23. xmlD.appendChild(report)
  24.  
  25. overStatus = xmlD.createElement('OVER_STATUS')
  26. overStatus.appendChild(xmlD.createTextNode('PASSED'))
  27. report.appendChild(overStatus)
  28.  
  29. returnResult = []
  30. returnResult.append(xmlD)
  31. returnResult.append(report)
  32. returnResult.append(overStatus)
  33.  
  34. except Exception,ex:
  35. return ex.message
  36. return returnResult
  37.  
  38. def writeOverStatus(self,overStatus = 'PASSED'):
  39. self.__struct[2]._get_childNodes().item(0).nodeValue = overStatus
  40.  
  41. def writeReport(self,dict,xmlPath):
  42. #reportNodeList = self.createReportNode()
  43.  
  44. entry = self.createLogEntry(self.__struct[0],dict)
  45. self.__struct[1].appendChild(entry)
  46.  
  47. self.writeXml(self.__struct[0],xmlPath + r'\reportLog.xml')
  48. #self.writeXml(self.__struct[0],gl.reporterPath+'reportxml_%s.xml'%(gl.curTimeStr))
  49.  
  50. #-------------创建xml格式-有多个相同的节点,并且该节点下有4个名称相同的子节点----------------
  51. #createLogEntry(self,docObj,executeTime,stepResult,description,stepDiscription,action,index,element,value,expectResult):
  52. def createLogEntry(self,docObj,dict):
  53. entry = docObj.createElement("LOG_ENTRY")
  54.  
  55. status = docObj.createElement("STATUS")
  56. nodeStep = docObj.createElement("STEP")
  57. nodeExecuteTime = docObj.createElement("EXECUTION_TIME")
  58. nodeStepResult = docObj.createElement("STEP_RESULT")
  59. nodeComponentName = docObj.createElement("DESCRIPTION")
  60. nodeStepDiscription = docObj.createElement("STEP_DESCRIPTION")
  61. nodeActin = docObj.createElement("ACTION")
  62. nodeIndex = docObj.createElement("INDEX")
  63. nodeElement = docObj.createElement("ELEMENT")
  64. nodeValue = docObj.createElement("VALUE")
  65. nodeExpectResult = docObj.createElement("EXPECTED_RESULTS")
  66. nodeimagePath = docObj.createElement('IMAGE_PATH')
  67.  
  68. status.appendChild(docObj.createTextNode(dict['stepResult']))
  69.  
  70. nodeStep.appendChild(docObj.createTextNode(str(dict['Step'])))
  71. nodeExecuteTime.appendChild(docObj.createTextNode(dict['executeTime']))
  72. nodeStepResult.appendChild(docObj.createTextNode(dict['stepResult']))
  73. nodeComponentName.appendChild(docObj.createTextNode(dict['description']))
  74. nodeStepDiscription.appendChild(docObj.createTextNode(dict['stepDiscription']))
  75. nodeActin.appendChild(docObj.createTextNode(dict['action']))
  76. nodeIndex.appendChild(docObj.createTextNode(dict['index']))
  77. nodeElement.appendChild(docObj.createTextNode(dict['element']))
  78. nodeValue.appendChild(docObj.createTextNode(dict['value']))
  79. nodeExpectResult.appendChild(docObj.createTextNode(dict['expectResult']))
  80. nodeimagePath.appendChild(docObj.createTextNode(dict['ImagePath']))
  81.  
  82. entry.appendChild(status)
  83. entry.appendChild(nodeStep)
  84. entry.appendChild(nodeExecuteTime)
  85. entry.appendChild(nodeStepResult)
  86. entry.appendChild(nodeComponentName)
  87. entry.appendChild(nodeStepDiscription)
  88. entry.appendChild(nodeActin)
  89. entry.appendChild(nodeIndex)
  90. entry.appendChild(nodeElement)
  91. entry.appendChild(nodeValue)
  92. entry.appendChild(nodeExpectResult)
  93. entry.appendChild(nodeimagePath)
  94. return entry
  95.  
  96. #参数,xml对象,准备存储xml文件路径,文件模式:读 and 写 (r and w)
  97. def writeXml(self,xmlDoc,xmlPath):
  98. f = open(xmlPath,"w")
  99. xmlDoc.writexml(f,indent='\t', addindent='\t', newl='\n', encoding="utf-8")
  100. f.close()

 4、生成效果(报告内显示图片,点击会显示大图)

Selenium基本使用(十二)测试报告生成的更多相关文章

  1. selenium python (十二)下拉框的处理

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #下拉框在web页面上非常常见,对于下拉框的处理采用二次定位的方法进行元 ...

  2. Python+Selenium笔记(十二):数据驱动测试

    (一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...

  3. Pytest学习(十二)-生成HTML报告插件之pytest-html的使用

    环境前提 Python3.6+ 安装插件 pip3 install pytest-html -i http://pypi.douban.com/simple/ --trusted-host pypi. ...

  4. TensorFlow从1到2(十二)生成对抗网络GAN和图片自动生成

    生成对抗网络的概念 上一篇中介绍的VAE自动编码器具备了一定程度的创造特征,能够"无中生有"的由一组随机数向量生成手写字符的图片. 这个"创造能力"我们在模型中 ...

  5. Selenium系列(十二) - 自动化必备知识之CSS选择器的详细使用

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  6. selenium 自动化测试 测试报告 生成

    https://www.cnblogs.com/yoyoketang/p/6140439.html https://www.cnblogs.com/testyao/p/5658200.html 一.下 ...

  7. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  8. Java进阶(五十二)利用LOG4J生成服务日志

    Java进阶(五十二)利用LOG4J生成服务日志 前言 由于论文写作需求,需要进行流程挖掘.前提是需要有真实的事件日志数据.真实的事件日志数据可以用来发现.监控和提升业务流程. 为了获得真实的事件日志 ...

  9. 爬虫系列(十二) selenium的基本使用

    一.selenium 简介 随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载 对于爬取这些网站,一般有两种思路: 分析 Ajax 请 ...

随机推荐

  1. {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性  定位(position)z-index

    前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式表来对文 ...

  2. [No0000100]正则表达式匹配解析过程分析(正则表达式匹配原理)&regexbuddy使用&正则优化

    常见正则表达式引擎引擎决定了正则表达式匹配方法及内部搜索过程,了解它至关重要的.目前主要流行引擎有:DFA,NFA两种引擎. 引擎 区别点 DFA Deterministic finite autom ...

  3. [No0000C2]WPF 数据绑定的调试

    )DataBinding的表达式无效时,跟踪Debug的输出信息来查找原因(2)DataBinding的表达式有效,但是数据和期望值不同,此时可以在Converter中断点调试 :在VS输出窗口跟踪信 ...

  4. en-zh(科学技术)science and technology

    S Korea to roll out 5G韩国正式推5G商用服务 South Korea will become the first country to commercially launch f ...

  5. [yum] yum使用光盘安装或更新软件

    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_ ...

  6. 将DOS格式的shell脚本转为UNIX格式

    shell脚本是UNIX格式,在修改其中内容时,务必保持UNIX格式.UE编辑器打开时,会询问是否转为DOS格式,请点否.如果修改完成后,不能确认是否为DOS格式,可以使用UE文件菜单下的Conver ...

  7. 《Redis 主从复制》

    万念俱灰,说的就是我现在的心情...... 周六下午写了一下午的读书笔记,由于我的 MAC 有点问题,重启了一下...... 灰飞烟灭...... 读 第八章<集群> 总结 1:如何开启主 ...

  8. AES加解密所遇问题

    AES加解密后解密数据末尾携带多余空格,经查看是由于加密时数据不足16个字节自动补齐导致 解决办法:记录加密数据长度,解密后根据数据长度读取解密数据. 另外加密数据中可能存在0等数据,所以拷贝内容时最 ...

  9. Log4j与Logback

    一.Log4j简介: 1.Log4j(log for java) 01.是apache的一个开源项目 02.是使用java语言编写的一个日志框架 03.用于记录程序中的日志信息 04.可以将日志信息输 ...

  10. vim常用指令整理小结

    启动Vim后,默认是在 Normal 模式下,但是我们有时不知道是在编辑模式还是normal模式,按ESC键就可以返回normal模式.因为所有的命令都需要在Normal模式下使用,所以建议多按几下E ...