最近公司在开发聊天的功能,需要收到新消息后,让消息位于最前面,将List中元素放到第一位,也就是置顶。
方法一: Collections.swap(list,a,b)
list是你需要换位置的List。
a是你当前需要换位置的元素的索引。
b是你需要将这个元素换到哪个索引。
我后面还查询到一个方法。
方法二: list.add(0, list.remove(i));
错误 Reports assignments directly to a struct field of a map
文章目录 1. 问题的产生2. 问题产生的原因3. 问题的解决整体更新map的value部分把map的value部分定义为对应类型的指针类型或是slice或是map 1. 问题的产生 这个问题在github上可以追溯到2012年提交的一个issue,链接为https://github.com/golang/go/issues/3117;如上图,结构体作为map的元素时,不能够直接赋值给结构体的某个字段,也就是map中的struct中的字段不能够直接寻址。
2. 问题产生的原因 关于golang中map的这种古怪的特性有这样几个观点:
map作为一个封装好的数据结构,由于它底层可能会由于数据扩张而进行迁移,所以拒绝直接寻址,避免产生野指针;map中的key在不存在的时候,赋值语句其实会进行新的k-v值的插入,所以拒绝直接寻址结构体内的字段,以防结构体不存在的时候可能造成的错误;这可能和map的并发不安全性相关 3. 问题的解决 整体更新map的value部分 package main import "fmt" type Person struct{ name string sex string age int } func main(){ m := map[uint]Person{ 0 : Person{"张无忌", "男", 18}, 1 : Person{"周芷若", "女", 17}, } //m[0].age += 1 //整体更新结构体 temp := m[0] temp.age += 1 m[0] = temp fmt.
经过一周时间的调研,环保行业2017年的薪酬统计结果终于和大家见面了!
这份薪资调研报告汇集了8375个环保人的共同努力,参与调研的小伙伴来自环保水圈订阅用户及其朋友圈、76个环保微信社群、9个行业协会等环保行业渠道。非常感谢参与此次调研的所有同行小伙伴!
我们从环保人的岗位、职位、学历、出生年份、工作年限、所在地域等7个维度全面统计了环保人的薪资水平情况。尽可能真实全面的反映出环保人各岗位的真实薪资水平。
以下为调研报告正文 图片设计:环保一哥
本文将从三个部分全面解读此次调研结果
(只关心薪资水平的看第一部分即可)
第一部分:展示2017环保行业平均薪资水平
第二部分:此次调研的样本数据情况
第三部分:对此次调研结果的深度分析
Part 1 2017环保行业平均薪资
行业有一半人工资在6k以下
▼
可以看出大约有30%的人薪资分布在3k~5k之间,大约30%的人薪资分布在5k~8k之间,有15%的人薪资分布在8k~12k之间,12k以上的高薪人群占比达25%左右。
不同岗位的平均薪资(研发岗位表现抢眼)
▼
不同级别的平均薪资
▼
不同工作年限的平均薪资
▼
不同地域的平均薪资(北京、上海表现抢眼)
▼
可以看出,本次调研中平均月薪Top3的省份是是北京、上海和浙江。参与调查的省份中最低平均月薪为5043。
Part 2 2017薪酬调研样本数据情况展示
此部分为此次调研的详细样本数据情况,分别展示了参与调查人群的岗位、级别、学历、工作年限、年龄和地域分布情况。
01 岗位分布状态
数据显示,在参与调研的人中,工艺设计、调试、运营和销售以及高层管理岗位的人数所占比例较大。
02 岗位级别分布状态
在本次调研中,基层岗人员最多,所占比例超过了50%;接下来是主管岗位和部门经理岗位,所占比例总和为37.9%;副总经理(副总工)级别以上的参与调研人数最少,占10.3%。
03 学历分布状态
参与调研的人员中,本科以上学历的人数占76.1%;大学专科占比18.5%;高中以下学历人数最少,仅占5.6%。
04 工作年限分布状态
1~3年的入门级阶段人数占39.1%,4~6年的进阶级阶段人数占23.4%,7年以上深耕阶段人数占37.4%。总体来说,入门阶段人数最多,其次是深耕阶段。
05 年龄分布状态
可以看出,90后的从业者将近占整个行业的43%,而80后的从业者也将近占了整个行业的43%,还有不到20%的人是70后和60后。说明环保行业的主力军是80后和90后。 06 地域分布状态
本次调研中,北京、江苏、广东以及浙江等地的人数居多。
Part 3 2017平均薪资调研结果深度分析
此部分为针对此次调研人群的岗位、学历、工作年限以及地域分布和工资的关系进行深入分析。
01 工资 x 岗位
因为此次调研中,工艺设计、运营、调试、销售、研发以及环境监测岗位参与调研人数较多,所以下面重点分析这几个岗位工资分布情况。
1、在所有工艺设计的岗位中,工资分布如下:
工艺设计岗位薪资在3k以下的人数很少,仅占5.3%;工资分布多数集中于5k~8k之间;薪资8k以上的各区间占比较低,8k~20k区间总和占比33.5%;20k以上占比5.5%。
如果以8k作为薪资的分水岭,工艺设计这个岗位8k以下的人数(65.2%)是8k以上人数(34.8%)的两倍。
2、在所有运营的岗位中,工资分布如下:
运营岗位薪资低于3k的占比达9.4%,高于工艺设计岗;工资分布多数集中于3k~5k的区间,略低于上面的工艺设计岗;而8k~20k的人数占比14.4,远低于工艺设计岗;薪资20k以上的人数仅占1.1%,依旧低于设计岗的人群。
如果以8k作为薪资的分水岭,运营岗位8k以下的人数(84.5%)大约是8k以上人数(15.5%)的五倍,悬殊巨大。说明运营岗位很难做到高薪水。
3、在所有调试的岗位中,工资分布如下:
调试岗位薪资低于3k的人数占比为4.9%,基本和工艺设计岗持平;人群占比最多的两个薪资区间为3k~4k和5k~6k;有73.2%的人工资分布在3k~8k之间;而薪资8k以上的人数仅占21.9%。
如果以8k作为薪资的分水岭,调试岗位8k以下的人数(78.1%)大约是8k以上人数(21.9%)的四倍,比运营岗位稍好,但也很难做到高薪水。
4、在所有环境监测的岗位中,工资分布如下:
环境监测岗位薪资水平3k以下的人群占比高达18.2%,工资分布多数集中于3k~4k的区间,比运营岗更低。薪资3k~8k的人数占比63.7%,而8k以上的人占比仅18.1%。
如果以8k作为薪资的分水岭,监测岗位8k以下的人数(63.7%)大约是8k以上人数(18.1%)的三倍,比运营岗位稍好。值得一提的是,50k以上的高薪人群占比达到了5%,高于之前的设计和运营调试岗。
5、在所有环境评价的岗位中,工资分布如下:
文章目录 使用BurpSuite进行APP抓包如何绕过代理检测场景描述如果绕过呢?总结与思考 使用BurpSuite进行APP抓包如何绕过代理检测 场景描述 最近接手到一个项目,对某客户的iosAPP进行渗透测试,虽然说客户发过来的是测试包,但是开了代理检测,我是怎么知道的呢,当然是先猜到了,后面尝试验证了的。因为开了代理检测,所以我在WIFI属性处设置代理就被检测到了。一设置代理打开APP就提示网络,点击前端功能点皆提示网络错误。代理关闭,APP就可以正常使用。
关于APP抓不到包可能是以下问题:
SSL证书没配置好客户端开启了代理检测客户端使用了双向证书校验客户端内嵌了自己的VPN 看到自己遇到的情况,我就猜测可能是前端做了代理检测了。
如果绕过呢? 有没有思考过一个问题?
客户端禁止你使用代理,会不会禁止你使用VPN呢?说到代理,作为一个合格的安全人员你应该会联想到中间人流量劫持、中间人攻击。那么VPN也会有这些吗,有时会有但是安全性相对较高。VPN可以走全局的流量,接入远程内网。一个APP你禁止我的流量走代理,但是你总不能不让我用VPN吧。
于是便有了以下的操作。
BurpSuite开启8080端口http代理,绑定地址为0.0.0.0或者局域网ip。在苹果手机上安装小飞机(SS),选择协议为http,连接信息填写BurpSuite的。
开启小飞机走全局流量到BurpSuite,然后APP就可以抓包了。 附加:在这样的流量转发的情况下,某些应用是使用异常的,例如QQ。因为http只能走某些协议的流量,另外的走不了。
总结与思考 SSL证书没配置好
解决:重新配置证书。客户端开启了代理检测
解决:走“正规”的流量转发,走全局流量转发。ios可以用小飞机,ios的小飞机支持多种协议协议类型。Android的小飞机貌似只能他自己的协议吧,暂时还没又找到好的软件。PC端当然可以用Proxifier了,具体怎么操作百度去吧,这个神器在内网渗透也可能会用到。除了流量转发也可以用Hook的方式,Hook怎么理解?可以简单的理解为对代码执行的修改与拦截。客户端使用了双向证书校验
解决:安卓上是有前人造好的轮子(插件和工具)可以解决双向证书校验的问题,ios暂时不了解,有时间再查查资料。大佬操作,逆向拿出证书,一招通杀所有。客户端内嵌了自己的VPN
解决:这个或许只用逆向了吧,改代码重新打包,其他的我暂时也不知道了。
需求: 顶部导航条的功能实现。
一、普通顶部导航栏 效果图: DefaultTabController( length: 2, //配置顶部tab的数量 child: Scaffold( appBar: AppBar( title: Text("普通顶部导航栏"), bottom: TabBar( tabs: <Widget>[ Tab(text: "热门"), Tab(text: "推荐"), ] ), ), body: TabBarView( //点击bar对应的内容,第一个组件对应第一个bar,第二个对应第二个,以此类推 children: [ Center( child: Text("第一个页面"), ), Center( child: Text("第二个页面"), ) ], ), ), ); 二、TabBar放在导航最顶部 比如已经设置底部导航栏再设置其中页面的顶部导航栏 出现问题: 因为底部导航栏已经使用过Scaffold设置了顶部栏目主题信息,再使用顶部导航栏 时候还要使用Scaffold设置,这就导致了会有两个顶部栏目,即两个标题 解决方案: 将顶部导航栏的内容放置自身Scaffold的title中,而不是放到bottom中
效果图: DefaultTabController( length: 2, child: Scaffold( appBar: AppBar( automaticallyImplyLeading:false, //去掉顶部返回按钮 title: Row( //因为title接收组件,故在title中设置导航栏 children: <Widget>[ Expanded( child: TabBar( tabs: <Widget>[ Tab(text: '分类1'), Tab(text: '分类2',) ], ) ) ], ), ), body:TabBarView( children: <Widget>[ Text('分类111'), Text('分类222') ], ), ), ); 顶部导航栏参数配置 在TabBar中与tabs同级设置
周一早上被这件事搞的很烦,但强迫症看着不是夜间模式的屏幕更难受,于是花了近两个小时来搞,终于搞定!!
原来是远程控制软件“向日葵”的问题,卸载即解决!!!
flutter SDK提供的ProgressIndicator不支持圆角属性的设置,看起来不是很美观,系统自带的LinearProgressIndicator是这样的:
这样的进度条显然无法满足UI设计师的要求,既然系统提供的进度条不支持圆角和渐变,那我们只能通过自定义view来实现了。
先来看一下实现的效果:
flutter是如何自定义view的呢,
flutter提供两个类来实现自定义view
CustomPaint :在绘制阶段提供一个 Canvas 画布CustomPainter : 可以设置画笔的颜色、粗细、是否抗锯齿、笔触形状以及作画风格等 下面就用这两个类的使用来实现一个渐变的圆角进度条
import 'package:flutter/material.dart'; class GradientLinearProgressBar extends StatelessWidget { final double strokeWidth;//画笔的宽度,其实是进度条的高度 final bool strokeCapRound;//是否需要圆角 final double value;//进度值 final Color backgroundColor;//进度条背景色 final List<Color> colors;//渐变的颜色列表 GradientLinearProgressBar({ this.strokeWidth = 2.0, @required this.colors, this.value, this.backgroundColor = const Color(0xFFEEEEEE), this.strokeCapRound = false }); @override Widget build(BuildContext context) { var _colors = colors; if (_colors == null) { Color color = Theme.of(context).accentColor; _colors = [color, color]; } return CustomPaint( size: MediaQuery.
网盘自建 1.准备工作2.下载源码并上传3.配置教程4.主题使用方法5.Oneindex文件描述6.给文件夹加密码7.可能出现的问题8.命令指示9.定时清除缓存10.转载须知 Oneindex不占用服务器空间,不走服务器流量,直接列出 OneDrive 目录,文件直链下载。有微软账号即可
1.准备工作 微软账号(刚注册的内存空间只有5G大小,需要扩宽内存可自行百度)下载oneindex的源码上传到自己的服务器即可准备一个域名,或者放到自己域名的非根目录下服务器要求PHP空间,PHP 5.6+ 需打开curl支持 2.下载源码并上传 下载地址下载后上传到服务器,根目录或者其他目录,按需安装 3.配置教程 登录设定的域名,开始部署配置
注:第三空将域名填入即可
点击蓝色按钮获取client_id和client_secret
client_secret
client_id 点击上方图片所示的知道了返回快速启动,下滑找到client_id
确认信息后点击下一步演示地址 效果主题为以下主题,按照指示修改即可 4.主题使用方法 主题包中的信息需要修改 主题包下载地址
找到 nexmoe 下 layout.php 使用打开
修改 第7行 、第9行 第18行 pan.mr90.top为自己域名(或者自己引用的目录)
修改 第15行 链接里的QQ 为自己QQ(或者自己引用的图片)
打开 theme 下 style.css 文件
修改 第97行、第103行 pan.mr90.top 为自己域名(或者自己引用的目录)
请删除原有 nexmoe 主题文件夹,将压缩包内 nexmoe 复制到该位置。
将 theme 文件夹放在网站根目录.(或者别的地方,可以引用就好)
5.Oneindex文件描述 文件描述仿照Github的README.md文件
在文件夹底部添加说明
在 OneDrive 的文件夹中添加`README.md`文件,使用 Markdown 语法。 在文件夹头部添加说明:
在 OneDrive 的文件夹中添加`HEAD.md` 文件,使用 Markdown 语法。 直接输出网页
我是谁?暴鲤龙
66.事务的提交
事务有点像打包操作
开启事务:start transaction
事务:可以有很多个步骤,这些步骤要么全成功要么全失败
提交事务:commit
67.事务的回滚
rollback,当遇到突发情况时,撤销执行的sql语句
事务中的语句执行后,在事务中查询会发现已经修改了,而实际数据库中并未修改。
rollback,撤回事务中执行的语句
68.事务并发操作-脏读
多人同时操作数据库
脏读:看到了还没提交的事务,read committed读提交能解决脏读问题
隔离级别:默认是重复读repeatable read,还可以是read uncommitted(一个事务可以读取另一个未提交事务的数据),read committed(一个事务要等另一个事务提交后才能读取数据),serializable
rollback和commit都可以结束事务。
69.事务的隔离级别
read uncommitted(一个事务可以读取另一个未提交事务的数据),会产生脏读、不可重复读、幻读
read committed(一个事务要等另一个事务提交后才能读取数据),不会产生脏读,会产生不可重复读、幻读
repeatable read(重复读,默认),不会产生脏读、不可重复读,会产生幻读
serializable,不会产生脏读、不可重复读、幻读
不可重复读:一个事务范围内两个相同的查询却返回了不同的数据,解决方法:repeatable read(重复读)
幻读:解决方法,serializable,但这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
70.添加用户
权限操作
权限:限制一个用户能够做什么事情,mysql中可设置全局权限,指定数据库权限,指定表权限,指定字段权限。
权限包括:create,drop,alter,delete,index,insert,select,update,create view,execute,可以限制用户。
创建用户:create user “用户名”@“localhost” identified by “1234”;也可以navicat图形化创建
删除用户:drop user 用户名”@“localhost”;也可以navicat图形化右键删除,
71.分配权限
分配权限:给所有权限
加上flush privileges,刷新一下。
也可以创建对指定数据库的所有权限:语句略
还可以只对某个表的权限:语句略
查看权限:show grants
删除权限:revoke 权限 on 数据库对象 用户
72.视图简介
视图:虚拟的表,内容由查询定义
视图特性:对若干表的应用,一张虚拟表,可以和基表一样进行增删改查
视图作用:安全性、查询性能提高,提高了数据的独立性。
73.视图创建、修改、删除
视图创建,创建后的结果就在view视图中,创建后就可以从视图中进行查询了。
修改视图:视图发生了改变
删除视图:
74.视图查询机制
视图机制:替代式(操作视图时,视图名直接被视图定义给替换掉,相当于是字句,替换成了sql语句),具化式(先查询后放在内存中,再从内存这个表中提取数据)
视图中的各种参数
1.问题描述 路由器设置为dhcp4,dhcp6,形成一个ipv4和ipv6的局域网。但是连接路由器的电脑有时可以获得ipv6地址,有时候获取不到。
2. 为什么会出现这个问题? 我用的是小米的AX3600路由器,可能是家用的的路由,所以不能保证ipv6的可靠性。
3.解决 路由器开启固定ip设置,分配地址池,建议固定ip从2-50,剩余的ip是留给dhcp的绑定电脑的mac地址到路由器,固定ip,然后重启路由器,重新连接电脑的网卡。验证电脑是否获取的ip为自己设定的固定ip。(路由器一般仅支持固定的ipv4)此时电脑是dhcp动态获取的。现在我们可以通过dhcp4和dhcp6获取,电脑的ipv4和ipv6地址。然后手动设置电脑的ip,将之前获取的ipv4和ipv6填好,手动需要设置网关。(如果这一步没有获取到ipv6的地址,在电脑设为dhcp的前提下操作:关闭电脑,关闭路由器,重启路由器,重启电脑,第一次连接或得到ipv6的地址) ubuntu 的固定ip配置可以参考:ubuntu 18.04桌面版 手动配置ipv6固定地址
from pyqt5 import qtcore,qtwidgets
import win32gui, win32api, win32con
# 调用win32api的模拟点击功能实现ctrl+v粘贴快捷键
def ctrlv():
win32api.keybd_event(17,0,0,0) #ctrl键位码是17
win32api.keybd_event(86,0,0,0) #v键位码是86
win32api.keybd_event(86,0,win32con.keyeventf_keyup,0) #释放按键
win32api.keybd_event(17,0,win32con.keyeventf_keyup,0)
# 调用win32api的模拟点击功能实现alt+s微信发送快捷键 (可以根据自己微信发送快捷键是什么来进行调整)
def alts():
win32api.keybd_event(18, 0, 0, 0) #alt
win32api.keybd_event(83,0,0,0) #s
win32api.keybd_event(83,0,win32con.keyeventf_keyup,0) #释放按键
win32api.keybd_event(18,0,win32con.keyeventf_keyup,0)
# 调用win32gui调用桌面窗口,获取指定窗口句柄id,激活窗口 ,向函数传递窗口名称to_weixin
def wx_send(to_weixin):
hw = win32gui.findwindow(none, to_weixin) # 获取窗口句柄
win32gui.getclassname(hw) # 获取窗口classname
title = win32gui.getwindowtext(hw) # 获取窗口标题
win32gui.getdlgctrlid(hw)
win32gui.setforegroundwindow(hw) # 激活窗口
app = qtwidgets.qapplication([])
data = qtcore.qmimedata()
url = qtcore.qurl.fromlocalfile(r'c:\users\1\desktop\差异.xlsx')
data.seturls([url])
app.clipboard().setmimedata(data)
clipboard = qtwidgets.
点击蓝字关注我们
往期精选
22 July 2019
浅谈测试计划
你真的会做用例评审吗?
测试人员必备技能:使用excel生成测试数据
实用测试方法系列-正交
实用测试技巧系列-excel
关于测试用例,我们测试人员的问题有很多,比如:
测试周期紧张时,是否可以不写用例?
测试周期紧张,希望用测试点来替代用例,可测试点的呈现形式和复杂程度应该如何控制呢?
为了方便分工,领导安排我们按照模块来编写用例,导致很多场景/流程没有覆盖,此时如何处理?
用什么工具来管理用例呢?excel或者专门的工具?哪种更优呢?
产品中很多页面的测试点很相似,每个页面都写用例感觉是在浪费时间,但不写用例又担心执行时有遗漏,怎么办?
产品的场景/流程较多,这意味着很多用例需要前后关联,此时该如何写用例才能更清晰、简洁呢?
终于把用例写完了,但发现按照用例执行的效果还不如随机测试效果好,并且感觉还浪费时间,怎么办?
用例评审时,自己很用心的在讲用例,但评审效果并不理想,原因是什么呢?怎么才能提升评审会的效果呢?
产品迭代频繁,每个迭代版本的测试用例不好选择,怎么办?
分配了几个人共同执行用例,其中不少模块还有重叠,但产品上线后仍然有漏测,分析原因并非因为用例覆盖不全,而是执行人没有完全理解设计者的意图,怎样才能提升用例执行的效果呢?
.....
诸如此类的疑问很多,今天我们先来聊聊“如何编写用例”的问题。编写用例是我们测试人员日常工作中最主要也是最频繁的工作,我们可以从书上或者网上查到很多这方面的资料,很遗憾的是,很难用一篇文章能把这个问题讲得全面而清晰。这也跟企业中面临的情况复杂多变有关,本文希望抛砖引玉,欢迎大家在文章下方留言。
01
思考用例的目的
“无效用例”的典型,就是那些看起来不错但实际没有任何用途的用例。每一条用例都需要慎重思考:为什么要写这条用例?希望达到什么目的?测试点是否清晰,跟自己的期望目标是否有出入?
02
用例要易于编写、修改和更新
需求的变更、执行用例时脑海中突然涌现的想法、随着对需求理解的加深而发现某些用例的不足以及产品补丁的添加等等,都会引起用例的变更。变更用例对我们来说是一种被动接受的行为,我们无需去考究这种行为的原因或者重要性,我们要考虑的是用什么方式管理用例才能让它便于更新。
对于一些简单项目,可能这个问题并不知道讨论,也许这种情况我们该讨论是否需要写用例?
但对于业务复杂、项目周期长或者迭代频繁的产品型系统,就很有必要来思考这个问题了。
对于这个问题,我想很多人会首先联想到自己工作中使用的用例管理工具,想到在那些工具中是如何新增/修改某条或某个模块的用例,会想到使用那些工具在更新用例时的一些不便之处。但编写/更新用例是从了解需求开始的一系列的工作,编写/更新用例只是这个流程中的最后一个环节。所以讨论这个问题,需要把我们的焦点放开一些,比如:
如何更快速的了解需求?是否有固定的套路,让无论是新手还是老手都能既高效、又准确的把握需求?答案是有的。
原先的项目测试负责人离开了,接手的人怎么做才能尽快开始用例的编写、更新?怎么写用例才能让刚接手这个项目的人很轻松的读懂?既能理解用例还不会花费过多的时间。
每条用例中的每个字段,在方便性上是否还有提升的空间?
为了减少用例的编写/更新时间,我们会借助公共的测试用例仓库,用例仓库应该整理哪些类型的用例?而项目用例集又如何使用用例仓库中的用例呢?
为了减少某条用例的编写/更新时间,我们常常复制一条跟它类似的用例,这个过程有没有地方可以改进?
应该制定什么样的标准,让场景/流程用例既能写起来简单,读起来也清晰?
如何安排测试用例和对应的测试数据?
用例更新后总得汇报吧,今天写了多少条用例,是针对哪些模块的?....若需要每天进行汇报,总不能每次都手工统计吧?
用例执行阶段也需要汇报,今天执行了多少,执行效果如何?....同样需要统计,目前的管理工具中是否支持,若不支持怎么做才能自动统计。
说明:篇幅所限,这里只给了问题没有给出答案。其实这些问题答案很简单,某些问题的答案在其他文章中已经给出,没有给出的后面的文章也会探讨。在笔者带团队的这些年,发现很多测试人员多专注于执行的工作,而对于改善工作并不会多做思考。不是其思考能力弱,而是没有这样的意识。所以笔者的文章风格也是倾向于提问题而不给答案,目的也是希望引导部分读者培养思考的习惯。
03
用例要易于执行
笔者的经验,很多测试人员在编写用例时不注意思考这个用例是否便于执行。写出来的用例乍一看很规范很清晰,但如果进一步思考如何执行这条用例就会发现这条用例其实是条无效用例。越是年轻的测试员这个现象表现越明显。
另外,如果经常遇到提测版本质量不过关,可以筛选恰当的用例交给开发人员,让开发人员按照用例进行自测。这就需要我们在编写/更新用例时思考,自己写的用例是否能很方便的“筛选”出交给研发的那部分?
04
使用测试用例集
属于一个场景或流程的测试用例,可能分散在不同的模块,这会导致执行不便。可以考虑
创建测试集在应对这种情况。某些公司习惯单独创建一个表格来管理测试相关的测试点,与测试集相比无关优劣,只是在需要监控每次迭代的执行结果时测试集更方便。方式的选择取决于公司的情况。
顺便提一点,如果用excel管理用例,建议多用excel的分组功能。
05
不要迷信需求和设计
不要迷信需求文档和设计文档,设计用例时仍要多思考需求和设计是否合理,是否有更好的方式。
06
总结
测试用例的编写是一项会对整个测试阶段产生重要影响的活动。这个事实使得测试用例文件编制这个任务变得非常的关键并且微妙。所以,编写测试用例得先适当的计划一下,还得非常的具有条理性。编制测试用例文件的人必须记住,这项活动不是为他/她自己而做的,而是为了整个团队,这个团队包括了其他测试人员和开发者,还有那些会被这项工作直接或间接影响到的 客户。 所以,在这项活动进行的过程中必须给予适当的关注。对所有的使用者来说,测试用例文档必须是很好理解的,方式明确,维护简单。除此而外,测试用例文档必须介绍所有重要的特征,必须覆盖所有重要的逻辑流,伴随着实时和实际可接受的输入。
点关注,不迷路
如果我的分享对您有帮助,欢迎添加我的个人微信号一起交流测试经验!
个人微信:shalayang
个人QQ:1345547759
QQ一群:169974486
QQ二群:512963247
现在开始讲《Linux多线程服务端编程:使用muduoC++网络库》一书的代码,对服务器多线程C++编程做一系列的介绍,首先本节将介绍最简单的一个线程安全示例Counter,其实现的是一个线程安全的计数器,首先下载书中源代码:
git clone http://github.com/chenshuo/recipes.git
代码是基于moduo网络库和标准boost库实现,故首先要安装boost和moduo,boost库的安装参看boost安装。
示例代码 Counter.cc在目录/recipes/thread/test下,首先介绍下如何编译Counter.cc,Counter.cc的编译还涉及到3个其他文件,均在目录/recipes/thread/下,分别为Mutex.h、Thread.h和Thread.cc,makefile内容如下:
CXX = g++ DEBUG = -g -O2 CFLAGS = $(DEBUG) -Wall -c RM = rm -rf LIBS = -lpthread -lboost_system -lboost_thread TARGET = Counter OBJS =Counter.o Thread.o $(TARGET) : $(OBJS) $(CXX) $^ -o $@ $(LIBS) Counter.o : Counter.cc $(CXX) $(CFLAGS) $< -o $@ Thread.o : ../Thread.cc $(CXX) $(CFLAGS) $< -o $@ clean: $(RM) $(TARGET) *.o 注意这里涉及boost库和多线程的编译,需要连接静态文件:-lpthread -lboost_system -lboost_thread。
下面来看代码,首先看Counter.cc的代码:
#include "../Mutex.h" using muduo::MutexLock; using muduo::MutexLockGuard; // A thread-safe counter class Counter : boost::noncopyable { // copy-ctor and assignment should be private by default for a class.
说是返回实际就是结束当前Activity
<ImageButton android:id="@+id/GoBack" android:layout_width="35dp" android:layout_height="35dp" android:layout_alignParentRight="true" android:src="@drawable/ic_baseline_keyboard_return_24" android:background="@color/green" android:onClick="GoBack"/> public class RegisterActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.register_layout); } public void GoBack(View view){ finish(); } }
Button添加属性android:background="@drawable/button_style"
drawable/button_style.xml内代码
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/green" /> //填充边框内颜色 <stroke android:width="2dp" android:color="@color/white" /> //设置边框的宽度以及颜色 </shape>
针对共享状态问题:“只管命令不要询问”(摘自:万字详文阐释程序员修炼之道) 对于一定数量的共享物品,如果是先查询再使用的情况。当剩余数不满足时,多个对象自己都会先查询再请求,那么总会有对象:看的到,但吃不到。但改为一个人管控这些物品,直接问能不能用,能用就给,就避免了这个问题。
缄默原则(摘自:万字详文阐释程序员修炼之道) 有问题再说,如果不是必要,没问题就别说。
在日常coding时,对于日志,如果正常的结果有被需要打印的必要,否则就不要打印。
随着航空测量技术的飞速发展,利用低空无人飞机进行航空摄影获取遥感数据已成为现实。利用Agisoftphotoscan软件进行影像数据处理,生成数字地表模型(DSM)和正射影像图(DOM)产品的生产。
数据生产流程
1:无人机的用途及种类的不同,无人机所获取的POS数据其文件格式也各有不同,这里首先要将POS数据格式做一定的修改,让其能顺利导入软件PhotoScan当中去。
打开photoscan软件,然后点击“菜单栏”--“工作流程”--“添加照片
2:“菜单栏”--“工作流程”--“对齐照片”此处“成对预选”选择“已禁用”精度:越高越好,处理时间越长
3:“菜单栏”--“工作流程”--“建立密集点云”
4:“菜单栏”--“工作流程”--“生成网格” 表面类型:任意 源数据:密集点云
5:“菜单栏”--“工作流程”--“生成纹理”
6:此时已经生成了三维模型。通过菜单栏--“文件”--“导出模型”
实践结果得出它可以创建高分辨率的带有真实地理参考的正射影像以及高质量带有详细彩色纹理的数字地表模型,并可以将成果转换到大地坐标或者工程坐标系中。
用matplotlib作图,有两个地方可以设置title,一个是在figure上,另一个是在axes上。当一个figure中包含多个axes的时候,这两个title就都要用上了。
测试代码:
import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(-5,5,100)
x2 = np.linspace(-2,8,100)
x3 = np.linspace(0,10,100)
x4 = np.linspace(3,13,100)
fig = plt.figure()
fig.suptitle('test 2*2 axes')
fig.subplots_adjust(hspace=0.4)
ax221 = fig.add_subplot(221)
ax221.set_title('01')
ax221.plot(x1,x1,color='red')
ax222 = fig.add_subplot(222)
ax222.set_title('02')
ax222.plot(x2,x2,color='green')
ax223 = fig.add_subplot(223)
ax223.set_title('03')
ax223.plot(x3,x3,color='purple')
ax224 = fig.add_subplot(224)
ax224.set_title('04')
ax224.plot(x4,x4)
plt.show()
fig的suptitle函数,axes的set_title函数!
运行效果:
matplotlib作图,设置figure和axes的title
fig.subplots_adjust(hspace=0.4),这行代码用来调试figure中多拍axes之间的间隔,默认的间隔小了一点点。
-- EOF --
油猴脚本 不知道油猴的,自行百度吧,之前写的一直说我违规(。。。。
下面就是油猴脚本了,接口我在网上找的免费的,答案并不标准(有些题选择改为判断或者选择顺序是变化的),所以没有写自动提交!
// ==UserScript== // @name 雨课堂形势与政策 // @namespace http://tampermonkey.net/ // @version v1.0 // @description 人生没有彩排,每天都是直播! // @author moddemod // @match https://changjiang-exam.yuketang.cn/* // @grant GM_xmlhttpRequest // @require https://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js // ==/UserScript== (function() { 'use strict'; let arrQueryFailed = []; console.log('welcome to moddemod...'); let lpanel = $('<div>', { html: "欢迎使用!<hr>按q自动开始查询答案...<br>不支持自动点击,由于没有找到合适的接口,该查询接口是我自己在网上找的免费的,有些题并查不到而且查出的答案并不标准化,有些题可能查出来是选择题,但是这里改成了判断题这种,所以就没写自动点击的了....<hr>有什么问题重试就可以了...<hr>建议配合查题软件一起使用,因为服务器不稳定,有时候本来题库中有,但是并发频率高,导致没有查到,但是你重复几次还是可以查到!<hr>纯技术情怀,不是大佬,简易脚本,有需要的可以自己在网上找付费的接口就可以.....", id: "lpanel", style: "position:fixed;z-index:9999;width: 300px;background-color: black;top:100px;left:20px;opacity: 0.7;color: purple;font-size:20px;font-weight:bold" }); lpanel.appendTo('body'); function query(question, div) { GM_xmlhttpRequest({ method: 'POST', url: 'http://www.yxykw.com/questions_my.jsp?user=null', headers: { 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8' }, data: 'question=' + question.
文件扩展名也称为文件的后缀名,是操作系统用来标志文件类型的一种机制。
A filename extension, also known as a file extension, is a mechanism used by the operating system to identify the file type.
关于扩展名的误区&特性
Misconceptions about Extensions & Features
- 文件扩展名是一个文件的必要构成部分(X)
The file extension is a necessary component of a file (X).
一个文件可以没有扩展名。只是对于打开文件操作,没有扩展名的文件需要手动选择程序去打开它,而有扩展名的文件会自动用设置好的程序(如有)去尝试打开(是“尝试打开”,而不是“打开”的原因参看下面的第2个误区)。
文件扩展名是一个常规文件名的重要构成部分,但一个文件并不一定需要一个扩展名。
A file can have no extension. Only for the open file operation, a file without an extension needs to be opened by a manually selected program.