一、Algorithm
二、Review
三、Tip
python encode & decode
把str转化为Bytes
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes
>>> 'ABC'.encode('ascii')
b'ABC'
>>> 'ABC'.encode('utf-8')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
- 纯英文的str可以用ASCII编码为bytes,内容是一样的,
- 含有中文的str可以用UTF-8编码为bytes。
- 含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
把Bytes变为str
如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'ABC'.decode('utf-8')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
python base64
import base64
content = "hello world"
e_content = content.encode()
print(e_content)
# >> b'hello world'
encoded_content = base64.b64encode(e_content)
print(encoded_content)
# >> b'aGVsbG8gd29ybGQ='
d_content = encoded_content.decode()
print(d_content)
# >> aGVsbG8gd29ybGQ=
decoded_content = base64.b64decode(d_content)
print(decoded_content)
# >> b'hello world'
python2 编码文件头
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
mysql limit
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
性能测试
服务端:
- 软件:最大线程数、缓存的设置、连接池、线程池。。。
- 硬件:
- CPU使用率: CPU使用率、CPU队列长度
- 内存使用率:可用内存量、页交换频率(内存与硬盘之间交换数据的频率)
- 硬盘使用率:硬盘使用率、硬盘队列长度
- 网卡流量:接收到的数据、发送出去的数据(吞吐量 I/O)
分类
- 负载测试:用于评估最佳用户数,确定最大用户数
- 压力测试:利用大于最大用户的负载进行测试
- 稳定性测试:标准用户、长时间、真场景
- 并发测试:模拟同时发请求
- 容量测试:模拟后台服务器端的大容量,数据库、硬盘、内存
约定
- 响应时间:2-5-8 : 2秒内合理;5秒内能接受;8秒最大时限;
- 资源利用率75% 以内
jmeter
- jmeter客户端配置:
在jmeter.properties中指定remote-host即可。其中1099是jmeter server默认的服务端口 。
- 命令行下远程分布式压力测试:
测试命令说明
./jmeter -n -t 压力测试.jmx -r -l results.jtl
n表示无GUI运行 t表示要运行的jmx文件 l指生成的文件名称 r指远程将所有agent启动
- 同时生成测试报告的命令为:
./jmeter -n -t 压力测试.jmx -r -l results.jtl -e -o /tmp/ResultReport
-e :在脚本运行结束后生成html报告 -o :用于存放html报告的目录
- beanshell
-
log 日志记录log.info()
-
vars 操作jmeter变量 vars.put(“jmeter_vars”, input_vars) # 把数据存入jmeter变量 vars.get(“jmeter_vars”) # 从jmeter获取变量
-
props 操作jmeter属性,实际引用了jmeter的配置信息,可以获取jmeter的属性,操作与vars类似。 但是只能put进去String类型,不能是对象 props.get(“TIMER.FACTOR””) props.put(“PROP1”,”abcde”)
-
prev 获取前面取样器的结果 prev.getResponseDataAsString(); // 获取响应信息 prev.getResponseCode(); //获取响应状态码
//BeanShell Assertion
import org.json.JSONArray;
import org.json.JSONObject;
String response = prev.getResponseDataAsString();
JSONArray ja = new JSONArray(response); // 利用JSONArray对象来实例化JSON数据
int jsonLen = ja.length();
for (int i=0; i<jsonLen; i++){
JSONObject jo = ja.getJSONObject(i);
log.info("===="+ jo.get("customerphone"));
}
JSONObject jo2 = ja.getJSONObject(0);
vars.put("customerphone", jo.get("customerphone"));
if (jsonLen >2){
Failure = true;
FailureMessage = " 查询到" + jsonLen + "条";
}
四、Share
软件测试价值提升之路 - 五
1. 探索式测试 vs 脚本式测试
探索式测试应用中也有很多需要注意的问题,例如:不同的人有不同的效果,管理者要有准确的预期。
- 新人,可以期望他加深了对产品和测试的理解;
- 经验丰富的人,可以通过他确认重要的影响因素在设计中已经都考虑到了;
- 善于发散思维的人,可以期望他发现较多严重的缺陷;
- 善于系统思维的人,可以期望他给出质量方面的结论。
不同的测试效果是由不同的思维习惯和知识结构决定的。这也是为什么在实践中,通常都是把探索式测试和剧本式测试结合起来,解决特定的质量风险,用特定的方法、特定的人去做。
2. 测试设计 vs 自动化
选择先发展自动化还是测试设计,需要抓住两条:
- 第一,自动化侧重工具能力建设,测试设计侧重人的能力建设,原则上优先改进短板;
- 第二,根据对问题的分析选择合适的路径,测试团队进行能力建设的契机,通常出现在产品质量出了问题的时候,原则上新开发的功能缺陷多优先改进测试设计;老功能缺陷多优先改进自动化。
自动化和测试设计,并不是非此即彼的选择,更理想的方式是,对问题进行分析,对测试设计进行改进,进而设计无需人工介入的方法,最后实现自动化验证.
项目管理人眼中:进度>成本>质量
3. 测试成长:
产品业务测试专才 : 新人-》特性质量保障-》项目质量保障-》产品质量保障-》测试专家 入门 -》 独立工作-》 广度拓展 -》 能力养成 -》 影响力发挥
工程能力提升和个人能力建设
4. 职业思维:
测试人员的职业习惯-只看到问题。人们更喜欢…听到解决建议。因此,采用问题+建议的方式提出自己的意见,是测试工程师需要掌握的常用工作技巧之一。