测试培训引发的感想-Zee(转载)
上一篇 / 下一篇 2009-05-21 22:03:15 / 个人分类:测试理论
如果不把已知的东西放出去,我就会固步自封。----Zee
转自:http://www.51testing.com/?uid-17369-action-viewspace-itemid-102117
原文:http://www.7dtest.com/archives/1714
在这几培训和最近别人问的问题中,感觉到有这么几件事情:
1. 有些人很想接触性能测试,但是一到具体的细节,兴趣索然。不管是工具的操作,还是理论的理解。要说我讲课能力有限,可以把人讲的没有兴趣,这是我个人问题。这个因素在实际的操作中,总不会有吧。实际的操作还是有些人觉得没什么意义。有的人就像是见了刺猬,不知道从哪下口。要说工具有多麻烦,我觉得也不至于。至少LoadRunner比word简单多了。我曾经说:一周时间完全可以掌握LoadRunner的操作,其他的就要看练习和经验了。这么说,是不是有经验的过来人,感觉对?当然人不可能都一样的。我想强调的就是工具并不复杂。复杂的是应用。
2. 理论对性能测试的指导作用容易被忽视。很多时候,技术人在考虑问题的时候,都是技术细节,觉得只要是理论都挺无聊的。大而泛,忽悠人用的。从我自己的感受来说,我觉得完全不是这样。当然对某个词的定义这样的理论问题,我们用不着太细究。但是性能测试理论,真的对我们的实际工作没有指导意义吗?或者说意义不大?比如,在讨论基准测试的时候,很多人都知道基准测试是什么意思?但是很少有人能把基准测试的范围和程度说清楚。应该测试什么?做到什么程度?这些仅是技术问题吗?在相应的位置上的测试人员,有没有考虑过你的职位能做或不能做什么事?能做到或做不到什么事情?应该做或不应该做什么事情?这些都会对项目的质量产生影响的。
3. 面对性能测试过程、结果、数据,真的理解清楚了吗?针对同一个数据和过程不同的人感觉到的层面是不一样的。这就是经验和能力的区别,就算是两个人做的结果完全一样,我想由于能力不同,也会这一结果的理解不同。在多次培训的过程中,我解释最大、最小、平均、标准方差等值的时候,都会有人有醒悟的样子。我们说为什么这几个值,重要到放在summary里面,为什么不是中位数?为什么不取个微分放那儿?其实,这都是有设计上的原因的。所以说,我们面对这些东西的时候,要知道它具体的含义,从而把握的更清楚。也对我们做的事情更确定。不会经常出现别人问几句就问倒了的现象。
写这个文章就是想告诉大家:
1. 技术是一步步积累的;
2. 理解自己做的事情。
希望看这篇文章的人,09年牛气冲天。
1,EBCDIC translation有什么用?
2,编译器和解释器有什么区别?
3,需要关联的数据怎么确定?
4,LR的协议包分为多少类?
5,树视图和脚本视图各有什么优点?
6,LR中的API分为几类?
7,action和init、end除了迭代的区别还有其他吗?
8,HTTP的超时有哪三种?
9,在什么地方设置HTTP页面filter?
10,pot mapping的原理是什么?
11,如何设置可以让一个虚拟IP对应到一个Vuser?
12,什么是contentcheck?如何来用?
13,network中的speed simulation是模拟的什么带宽?
14,进程和线程有什么区别?
15,生成WEB性能图有什么意义?大概描述即可。
16,如果刷新controller里的脚本?
17,WAN emulation是模拟什么的?
18,如何把脚本和结果放到load generator的机器上?
19,如何设置才能让集合点只对一半的用户生效?
20,在设置windows资源图监控的时候,用到的是什么端口和协议?在这一过程中,会有大概哪些问题?(大概描述)
对一个确定的产品的性能测试要求
对一个确定的产品来说性能测试的要求如下:
1,产品通信模型;
2,要测试的系统通信协议;
3,网络架构;
4,统计信息;
5,复杂信息的图例;
6,应用分析;
7,系统监控和管理;
8,功能;
9,业务分析;
10,人为因素分析;
11,系统的开发语言;
12,数据库设计和管理;
这上面列到的也已经超出了很多人的个人能力范围。所以我觉得这样要求一个人的话,也是非常不理智.
如果一个团队拥有这样的能力,就可以了.
LoadRunner中Regenerate Script功能的使用-Zee
如果你想回到原始录制的脚本,可以使用Regenerate scrīpt功能.这个功能对调试和修复一个已经损坏的脚本是非常有用的.当regenerator一个脚本时,它会移除所有手工加入到脚本中的内容.如果你添加参数到脚本中,VuGen保存录制时的参数,用参数列表来替换后,原有的参数并不会被删除.你可以重新插入原来建立的参数列表.
注意在使用这个功能时,只会整理录制的脚本,不会整理手工加入的脚本.
点击Regenerate scrīpt之后,有几个按钮可用:
第一个:OK
从原始的录制日志中重新生成脚本.此功能将移除所有在脚本中手工加入的关联/参数化代码.
当使用多协议时,可以指定哪些协议需要重新生成,如果需要自定义重新生成的选项,可以点击Options打开录制选项.选择协议,并指定哪些协议要重新生成哪些不需要.
例子:
这里,我录制了一个页面,
web_url("zeeslo", "URL=http://blog.csdn.net/zeeslo", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", EXTRARES, "Url=http://hi.images.csdn.net/css/Valentine/images/header_bg.gif", ENDITEM, "Url=http://www.csdn.net/images/share-add.gif", ENDITEM, "Url=http://counter.csdn.net/pv.aspx?id=26", ENDITEM, LAST); |
加入事务和参数:
lr_start_transaction("事务一"); web_url("zeeslo", "URL=http://blog.csdn.net/zeeslo", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", EXTRARES, "Url=http://hi.images.csdn.net/css/Valentine/images/header_bg.gif", ENDITEM, "Url=http://www.csdn.net/images/share-add.gif", ENDITEM, "Url=http://counter.csdn.net/pv.aspx?id={参数}", ENDITEM, LAST); lr_end_transaction("事务一", LR_AUTO); |
当使用Regenerate scrīpt功能之后:
web_url("zeeslo", "URL=http://blog.csdn.net/zeeslo", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", EXTRARES, "Url=http://hi.images.csdn.net/css/Valentine/images/header_bg.gif", ENDITEM, "Url=http://www.csdn.net/images/share-add.gif", ENDITEM, "Url=http://counter.csdn.net/pv.aspx?id=26", ENDITEM, LAST); |
我们看到,使用了Regenerate scrīpt之后,脚本回到刚录制后的状态.
其他:
VC中多线程使用
http://www.51testing.com/?uid-17369-action-viewspace-itemid-89315
MSDN中的C/S代码实例--Socket
增进测试初学者对代码的理解,这里我添加了客户端从文本读字符的功能:
有兴趣的可以添加自己想要的功能看看,比如,实现多线程等等。
Server:
// Server.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include "winsock2.h"
#pragma comment(lib, "WS2_32.LIB")
void main() {
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}
// Bind the socket.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
service.sin_port = htons( 27015 );
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return;
}
// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");
// Accept connections.
SOCKET AcceptSocket;
printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Bytes Recv: %ld\n", bytesRecv );
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
return;
}
Client:
// client.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include "winsock2.h"
#pragma comment(lib, "WS2_32.LIB")
#include <stdlib.h>
void main() {
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}
// Connect to a server.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 );
if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "";
char recvbuf[32] = "";
FILE *stream;
int RNumber;
if( (stream = fopen( "test.txt", "r" )) == NULL ) // C4996
// Note: _wfopen is deprecated; consider using _wfopen_s instead
{
printf("fopen failed!\n");
return;
}
if( ( RNumber = fread( sendbuf, sizeof( char ), 25, stream )) == 0)
{
printf("fread 0 character!\n");
return;
}
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
if (bytesRecv < 0)
return;
printf("Recv chartaacter:%s\n", recvbuf );
printf( "Bytes Recv: %ld\n", bytesRecv );
}
return;
}
TAG:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 715723
- 日志数: 415
- 图片数: 1
- 文件数: 3
- 建立时间: 2008-12-07
- 更新时间: 2015-07-14