Let's Go!

测试培训引发的感想-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年牛气冲天。

 

原来我写的一个LR面试题-Zee

 

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

当使用多协议时,可以指定哪些协议需要重新生成,如果需要自定义重新生成的选项,可以点击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:

 

评分:0

我来说两句

Open Toolbar