首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10000篇文章
优秀的个人博客,低调大师

Python办公自动化之从Word到Excel

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 大家好,今天有一个公务员的小伙伴委托我给他帮个忙,大概是有这样一份Word(由于涉及文件私密所以文中的具体内容已做修改) 一共有近2600条类似格式的表格细栏,每个栏目包括的信息有: 日期发文单位文号标题签收栏需要提取其中加粗的这三项内容到Excel表格中存储,表格样式如下: 也就是需要将收文时间、文件标题、文号填到指定位置,同时需要将时间修改为标准格式,如果是完全手动复制和修改时间,依照一个条目10s的时间计算,一分钟可以完成6条,那么最快也需要: 而这类格式规整的文件整理非常适合用Python来执行,好的那么接下来请Python出场,必要的信息我在代码中以注释信息呈现。 首先使用Python将Word文件导入 # 导入需要的库docx from docx import Document # 指定文件存放的路径 path = r'C:\Users\word.docx' # 读取文件 document = Document(path) # 读取word中的所有表格 tables = document.tables 再把问题逐个划分,首先尝试获取第一张表第一个文件条目的三个所需信息 # 获取第一张表 table0 = tables[0] 仔细观察可以发现一个文件条目占据了3行,所以对表格全部行循环迭代时可以设步长为3 注意观察表格,按照row和cell把所需内容解析清楚 # 在全局放一个变量用来计数填序号 n = 0 for i in range(0, len(table0.rows) + 1, 3): # 日期 date = table0.cell(i, 1).text # 标题 title = table0.cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() print(n, date, tite, dfn) 接下来需要解决的是,时间我们获取的是 2/1 这种 日/月的形式。我们需要转化成 YYYY-MM-DD格式,而这利用到datetime包的strptime和strftime函数: strptime: 解析字符串中蕴含的时间strftime: 转化成所需的时间格式 import datetime n = 0 for i in range(0, len(table0.rows) + 1, 3): # 日期 date = table0.cell(i, 1).text # 有的条目时间是空的,这里不做过多判别 if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = table0.cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() print(n, date, tite, dfn) 这样一张表的内容解析就完成了,注意这里用的是table[0]即第一张表,遍历所有的表加一个嵌套循环就可以,另外也可以捕获异常增加程序灵活性 n = 0 for j in range(len(tables)): for i in range(0, len(tables[j].rows)+1, 3): try: # 日期 date = tables[j].cell(i, 1).text if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = tables[j].cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() n += 1 print(n, date, title, dfn) except Exception as error: # 捕获异常,也可以用log写到日志里方便查看和管理 print(error) continue 信息解析和获取完成就可以导出了,用到的包是openpyxl from openpyxl import Workbook # 实例化 wb = Workbook() # 获取当前sheet sheet = wb.active # 设立表头 header = ['序号', '收文时间', '办文编号', '文件标题', '文号', '备注'] sheet.append(header) 在最内层解析循环的末尾加上如下代码即可 row = [n, date, ' ', title, dfn, ' '] sheet.append(row) 线程的最后记得保存 wb.save(r'C:\Users\20200420.xlsx') 运行时间在10分钟左右,大概离开了一会程序就执行结束了 最后附上完整代码,代码很简单,理清思路最重要 from docx import Document import datetime from openpyxl import Workbook wb = Workbook() sheet = wb.active header = ['序号', '收文时间', '办文编号', '文件标题', '文号', '备注'] sheet.append(header) path = r'C:\Users\word.docx' document = Document(path) tables = document.tables n = 0 for j in range(len(tables)): for i in range(0, len(tables[j].rows)+1, 3): try: # 日期 date = tables[j].cell(i, 1).text if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = tables[j].cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() n += 1 print(n, date, title, dfn) row = [n, date, ' ', title, dfn, ' '] sheet.append(row) except Exception as error: # 捕获异常,也可以用log写到日志里方便查看和管理 print(error) continue wb.save(r'C:\Users\20200420.xlsx') 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-04-21本文作者:陈熹本文来自:“51CTO”,了解相关信息可以关注“51CTO”

优秀的个人博客,低调大师

实例解说AngularJS在自动化测试中的应用

7月25日晚8点,线上直播,【AI中台——智能聊天机器人平台】,点击了解详情。 一、什么是AngularJS ? 1、AngularJS是一组用来开发web页面的框架、模板以及数据绑定和丰富UI的组件; 2、AngularJS提供了一系列健壮的功能,以及将代码隔离成模块的方法; 3、AngularJS于2009年发布第一个版本,由Google进行维护,压缩版94k。 二、AngularJS的核心思想 1、在AngularJS中通过数据视图双向绑定实现视图与业务逻辑解耦,这将提高代码的可测试性; 2、遵循MVC模式开发,鼓励视图、数据、逻辑组件间松耦合; 3、将测试与应用程序编写放在同等重要的位置,在编写模块的同时编写测试。因为各组件的松耦合,使得这种测试得以实现; 4、 应用程序页面端与服务器端解耦。两方只需定义好通信API,即可并行开发。 三、简单的栗子 问题:假设我们需要编写一个手机列表,支持对手机信息进行模糊搜索,且按指定字段排序,要怎么实现呢? 如上图所示,几乎没有DOM操作,更专注于业务逻辑! 下面编写HTML 编写控制器Controller PhoneListCtrl 控制器。例子中注入了$scope(数据模型)、$http(封装了ajax的服务)这两个服务都是angularjs内置服务,服务是可以自定义的。 $scope.phones = data; 在这个地方后台返回的数据应用到了数据模型中,这时前台UI会自动响应更新。 四、指令 4.1 什么是指令? 指令是AngularJS用来扩展浏览器能力的技术之一。在DOM编译期间,和HTML关联着的指令会被检测到,并且被执行。这使得指令可以为DOM指定行为或者改变DOM的结构。例如ng-controller、ng-src、ng-model等。 4.2 AngularJS的编译 4.3 简单的AngularJS指令写法 自定义指令的一般格式: angular.application(‘myApp’, []).directive(‘myDirective’,function(){ //一个指令定义对象 return{ }; //通过设置项来定义指令,在这里进行覆写 }); 下面我们来看一个简单的自定义指令的例子: module:这个方法将新建一个模块。AngularJS以模块管理代码。 directive:在模块中新建指令,指定的方法在编译步骤会被执行,执行后返回一个自定义的链接函数,这个链接函数在完成双向绑定后执行。 Restrict:它告诉AngularJS这个指令在DOM中可以何种形式被声明。E(元素), A(属性,默认值), C(类名)。 scope :可以被设置为true或一个对象。默认值是false。当scope设置为true时,会从父作用域继承并创建一个新的作用域对象。有三种绑定策略@ = &。 Template:一段HTML文本,或一个可以接受两个参数的函数,参数为tElement和tAttrs,并返回一个代表模板的字符串。 4.4 使用指令 ng-app="MyModule":在angularjs启动时指定初始化的模块(module)。当前指定的是自定义的模块。 drink water="{{pureWater}}":调用自定义的drink指令,将$scope中的pureWater属性赋值给指令中的water属性。 drink可以是一个属性,也可以是一个标签。 五、模块和服务 在AngularJS中,模块负责组织、启动、实例化应用。 模块的两个部分,一个是配置块,另一个是运行块。 配置块:在实例工厂(provider)注册和配置阶段运行。只有工厂、常量才可以注入到配置块中(常量的配置要放在前面); 运行块:注入器(injector)被创建后执行,被用来启动应用。实例和常量、变量等都能被注入。 AngularJS应用中的服务是一些用依赖注入捆绑在一起的、可替换的对象。这些对象可以提供一些封装好的逻辑操作,以供调用。 AngularJS内置了很多有用的服务,例如前面提到的$timeout、$http等,我们可以通过使用内置服务完成大部分业务逻辑。但很多时候我们还需要自定义服务: 服务的使用 上图的代码中定义了一个服务notify,它依赖另外一个服务$window。$window中封装了window对象的方法,定义了一个控制器myController,并为这个控制器注入了notify服务,同时在控制器的scope中定义了一个方法callNotify来调用服务。$inject是依赖注入的一种方式,请参看下文依赖注入章节。 六、依赖注入 我们可以将需要的服务比作一件工具,比如一把锤子,那我们要怎么获得锤子呢? 第一种方法:自己打造一把锤子。如果锤子的工艺改变了,我们就需要重新制造。相当于我们在程序中new了一个服务,服务的实现改变时,只能修改代码,这将产生风险。 第二种方法:我们找到一间工厂,告诉工厂锤子的型号,然后工厂为我们制造。这时候就不需要关系锤子是怎么做的,我们只管使用。但是这种方式还是很麻烦,我们需要知道工厂在哪。类似于在代码中通过工厂方法获取我们想要的服务。这种方会对工厂产生依赖。 第三种方法:我们在门前贴张单子,声明我们需要一把什么型号的锤子,第二天就有人默默地送来了一把锤子。这在现实生活中简直是痴心妄想,但这种方式确实很轻松,不需要考虑任何东西,我们只关注使用锤子。这就是程序里的依赖注入。只要声明了需要什么,在使用的时候就可以得到什么。 6.1 AngularJS中的依赖注入 第一种方式:通过方法参数名声明依赖。这种方式不推荐使用,因为js文件压缩后方法参数名会改变。 第二种方式:声明一个数组,依赖列表放数组的前部,注入目标放数组最后一个元素。推荐使用这个方法。 第三种方式:通过$inject属性来声明依赖列表。 七、文章里没有介绍但需去了解的 1、$scope的生命周期,这是一个相当重要的内容。 2、AngularJS对于表单的支持。AngularJS内置了表单的服务,可以大大提高开发效率。 3、指令的详细定义方式。很多时候,简单的指令写法不能满足需求,需要更深度的定制指令。 4、如何进行测试。在AngularJS中,测试非常简单,可以使用其它的测试库进行测试(如Jasmine)。 作者:武贯祥 来源:宜信技术学院

优秀的个人博客,低调大师

python自动化办公:玩转word之页眉页脚秘笈

节将就python操作word的页眉页脚技巧做深入介绍。 使用页眉和页脚 python操作word的页眉页脚技巧做深入介绍 Word支持页眉和页脚。页眉是出现在每个页面的上边距区域中的文本,与文本主体分开,并且通常传达上下文信息,例如文档标题,作者,创建日期或页码。文档中的页眉在页面之间是相同的,内容上只有很小的差异,例如更改部分标题或页码。页眉也称为运行头。 一个页面页脚中的每个日日夜夜,只不过它出现在页面底部的页头类似。它不应与脚注混淆,脚注在页面之间不一致。为了简洁起见,这里经常使用术语标题来指代可以是页眉或页脚对象的内容,信任读者以理解它对两种对象类型的适用性。 访问节的标题 页眉和页脚与一个部分相关联; 这允许每个部分具有不同的页眉和/或页脚。例如,横向部分可能具有比纵向部分更宽的标题。 每个section对象都有一个.header属性,提供对该节的对象的访问: >>>document = Document() >>>section = document.sections[0] >>>header = section.header >>>header <docx.section._Header object at 0x...> 甲目的是总是存在于Section.header,即使当没有报头该节限定。实际标头定义的存在表示为_Header.is_linked_to_previous: >>>header.is_linked_to_previous True 值为True表示对象不包含标题定义,该节将显示与上一节相同的标题。这种"继承"行为是递归的,因此"链接"标题实际上从具有标题定义的第一个前一部分获得其定义。此"链接"状态在Word UI中显示为"与以前相同"。 新文档没有标题(在它包含的单个部分),因此 .is_linked_to_previous就是True这种情况。请注意,这种情况可能有点违反直觉,因为没有要链接的前一个节头。在此"无前一个标题"的情况下,不显示标题。 添加标题(简单情况) 只需编辑 对象的内容即可将标题添加到新文档中。一个对象是一个"故事"容器及其内容进行编辑,就像一个对象。请注意,与新文档一样,新标题已包含单个(空)段落: >>>paragraph = header.paragraphs[0] >>>paragraph.text = "Title of my document" 添加内容(甚至只是访问header.paragraphs)的行为添加了标头定义并 另请注意,添加内容(甚至只是访问header.paragraphs)的行为添加了标头定义并更改了以下状态.is_linked_to_previous: >>>header.is_linked_to_previous False 添加"分区"标题内容 具有多个"区域"的标题通常使用精心放置的制表位来完成。中心和右对齐"区域"所需的制表位是HeaderWord中潜在样式的一部分 ,但该样式不存在于默认python-docx 模板中,需要添加: >>> fromdocx.enum.styleimportWD_STYLE_TYPE >>> fromdocx.enum.textimportWD_TAB_ALIGNMENT >>>styles = document.styles >>>style = styles.add_style("Header", WD_STYLE_TYPE.PARAGRAPH) >>>style.base_style = styles["Normal"] >>>tab_stops = style.paragraph_format.tab_stops >>>tab_stops.add_tab_stop(Inches(3.25), WD_TAB_ALIGNMENT.CENTER) >>>tab_stops.add_tab_stop(Inches(6.5), WD_TAB_ALIGNMENT.RIGHT) 如果您使用的是自定义模板而不是python-docx默认模板,那么在模板中定义该样式可能是有意义的。 一旦Header式存在时,突片用于分离左,中和右对齐头内容: >>>paragraph = header.paragraphs[0] >>>paragraph.text = "Left Text Center Text Right Text" >>>paragraph.style = document.styles["Header"] 突片用于分离左,中和右对齐头内容: 删除标题 可以通过分配True其 .is_linked_to_previous属性来删除不需要的标头: >>>header.is_linked_to_previous =True >>>header.is_linked_to_previous True True分配给 标题时,标题的内容将被不可逆转地删除.is_linked_to_previous。 理解多节文档中的标题 "刚开始编辑"方法适用于简单的情况,但为了理解多节文档中的标题行为,一些简单的概念将有所帮助。简而言之: 1. 每个部分都可以有自己的标头定义(但不必)。 2. 缺少标头定义的部分会继承之前部分的标头。当存在定义而不存在_Header.is_linked_to_previous定义时,该属性仅反映标头定义的False存在True。 3. 缺少标头定义是默认状态。新文档没有已定义的标题,也没有新插入的部分。.is_linked_to_previous报告 True这两种情况。 4. 如果_Header对象的内容具有标题定义,则它是自己的内容。如果不是,它的内容是第一现有节的不具有标题的定义。如果没有节具有标题定义,则在第一节中添加新节,并且所有其他节继承该节。这种添加标头定义是在第一次访问标头内容时发生的,可能是通过引用 header.paragraphs。 添加标题定义(一般情况) 可以通过赋予False其.is_linked_to_previous属性来为缺少一个节的节提供显式标头定义 : >>>header.is_linked_to_previous True >>>header.is_linked_to_previous =False >>>header.is_linked_to_previous False 新添加的标头定义包含一个空段落。请注意,以这种方式保留标题偶尔会有用,因为它有效地"关闭"该部分的标题以及之后的标题,直到具有已定义标题的下一部分。 分配False给.is_linked_to_previous已具有标头定义的标头不会执行任何操作。 自动定位继承的内容 编辑标题的内容会编辑源标题的内容,同时考虑任何"继承"。因此,例如,如果第2节标题继承自第1节并且您编辑第2节标题,则实际上更改了第1节标题的内容。除非您首先明确指定False其.is_linked_to_previous属性,否则不会为第2节添加新的标头定义。

优秀的个人博客,低调大师

zabbix自动化线上实战--Zabbix lld发现磁盘监控

Zabbix3.0入门到生产环境应用实战: http://www.roncoo.com/course/view/fb3050a5b34b42f39ccad83ebebc89c1 一、软件版本 操作系统:CentOS-6.5-x86_64 zabbix版本:3.0.3 二、脚本编写: 1、python版本: #!/usr/bin/env python import json import subprocess def get_disk(): cmd = """grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions|awk '{print $4}'""" disk_data = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) disk_total = [] disktotal_dict = {"data":None} for dev in disk_data.stdout.readlines(): disk_dict = {} disk_dict["{#DISKNAME}"]=dev.strip("\n").strip() disk_total.append(disk_dict) disktotal_dict["data"]=disk_total jsonstr = json.dumps(disktotal_dict, sort_keys=True, indent=4) return jsonstr if __name__ == "__main__": print get_disk() 2、shell脚本版本: #!/bin/bash disk_array=(`grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions|awk '{print $4}'`) length=${#disk_array[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#DISKNAME}\":\"${disk_array[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n" 三、key的查看解析:主要 /proc/diskstats文件读取: 1、读取具体文件解析: [root@BJ-monitor-h-01 ~]# cat /proc/diskstats | grep sda 8 0 sda 844141 181483 43038400 10926021 147765030 3756991779 31237698668 4206792245 0 52927059 4217644644 ##每一项解读: 844141 181483 43038400 10926021 147765030 3756991779 31237698668 4206792245 0 52927059 4217644644 第一个区域:读完成次数 ----- 读磁盘的次数,成功完成读的总次数。 第二个区域:合并读完成次数, 第6个域:合并写完成次数。为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。 第3个域:读扇区的次数,成功读过的扇区总次数。 第4个域:读花费的毫秒数,这是所有读操作所花费的毫秒数 第5个区域:写完成次数 ----写完成的次数,成功写完成的总次数。 第6区域:合并写完成次数 -----合并写次数。 第7个域:写扇区次数 ---- 写扇区的次数,成功写扇区总次数。 第8个域:写操作花费的毫秒数 --- 写花费的毫秒数,这是所有写操作所花费的毫秒数 第9个域:正在处理的输入/输出请求数 -- -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。 第10个域:输入/输出操作花费的毫秒数 ----花在I/O操作上的毫秒数,这个域会增长只要field 9不为0。 第11个域:输入/输出操作花费的加权毫秒数 ----- 加权, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。 2、编写agnet key的几个监控项目: UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}' ###读磁盘完成的次数 UserParameter=custom.vfs.dev.read.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$7}' ###读花费的毫秒数 UserParameter=custom.vfs.dev.write.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$8}' ###写完成的次数 UserParameter=custom.vfs.dev.write.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$11}' ###写操作花费的毫秒数 UserParameter=custom.vfs.dev.io.active[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$12}' ###当前的IO情况 UserParameter=custom.vfs.dev.io.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$13}' ###花在I/O操作上的毫秒数 UserParameter=custom.vfs.dev.read.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$6}' ##读取扇区次数 UserParameter=custom.vfs.dev.write.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$10}' ##写扇区次数 关注微信:

优秀的个人博客,低调大师

单元测试代码自动化生成解决方案

写在前面的话: 鄙人星云,今年六月份,刚到北京入职了一家国企,由于刚进项目对现有的项目业务还不是很熟悉,但是领导已经下了命令,要我给现有的项目写单元测试代码,项目比较大,业务还不熟悉,如果全部手写测试代码,必然是个累死人不偿命的事情。 那么有没有更好的解决方案呢?答案自然是肯定的。 解决方案: 通过查询资料得知,在码农界有这样一个Eclipse插件——CodePro Analytix,通过这个插件可以自动批量生成单元测试代码。 CodePro Analytix是一个基于Eclipse的快速开发环境,能够自动的完成重复的任务使Java开发者快速的开发出高质量的软件。能够保证代码质量,包括代码评审、metric、设计模式、测试,等等 使用指南: CodePro Analytix 插件下载 下载后解压到一个路径下,路径中最好不要有中文。解压后像这样: 打开你的Eclipse IDE 我用的IDE是STS——Spring 官方推出的Eclipse发行版。 Help------> Install new Software 5.Work With: --------> add... ------->Local...浏览找到刚才解压的路径6.选中这三个选项,然后一步一步安装即可7.安装完成后重启下你的Eclipse 即可。8.修改配置 Windows------> Perference ——————Code Pro ------->JUnit ----->Generated Code默认是这样的: 但是一般我们需要修改下才符合我们常规的使用 10.最后选中项目中的源码文件或者源码文件夹或项目名,右键------>Code Pro Tools----->Generate Test Case即可这样,批量的单元测试代码就生成了。 接下来讲解一些注意事项: 关于JUnit报initializationError的解决方法 <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> 2.关于一些莫名奇妙无法处理的异常处理比如莫名奇妙的空指针异常,可以在测试注解中添加这个值 @Test(expected = java.lang.NullPointerException.class) 或者如果有其他的异常类似这个: @Test(expected = org.apache.axiom.om.OMException.class) public void testSerialize_1() throws Exception { PostEvent fixture = new PostEvent(); fixture.setEventName(""); fixture.setEventData(""); fixture.localEventNameTracker = true; fixture.localEventDataTracker = true; QName parentQName = new QName(""); OMFactory factory = new OMLinkedListImplFactory(); MTOMAwareXMLStreamWriter xmlWriter = new MTOMAwareOMBuilder(); fixture.serialize(parentQName, factory, xmlWriter); // add additional test code here // An unexpected exception was thrown in user code while executing this test: // org.apache.axiom.om.OMException: localname can not be null or empty // at org.apache.axiom.om.impl.llom.OMElementImpl.<init>(OMElementImpl.java:135) // at org.apache.axiom.om.impl.llom.OMElementImpl.<init>(OMElementImpl.java:118) // at org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory.createOMElement(OMLinkedListImplFactory.java:75) // at org.apache.axis2.databinding.utils.writer.MTOMAwareOMBuilder.writeStartElement(MTOMAwareOMBuilder.java:101) // at org.apache.axis2.databinding.utils.writer.MTOMAwareOMBuilder.writeStartElement(MTOMAwareOMBuilder.java:92) // at com.travelsky.dcsi.PostEvent.serialize(PostEvent.java:178) // at com.travelsky.dcsi.PostEvent.serialize(PostEvent.java:151) } 看到这样的信息就添加注解: @Test(expected = org.apache.axis2.databinding.ADBException.class) 关于断言测试常用的几种用法: //如果result不为空返回true测试通过 assertNotNull(result); //第一个参数是期待结果,第二个是实际的引用对象 assertEquals(true, result.hasNext()); //支持多种数据类型 assertEquals(2, result.next()); //期待结果是null 接受一个引用对象参数 assertNull(result) 本篇完~ 交流即分享,分享才能进步! 不对之处,还请各位前辈多多指教。 by 星云 *

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册