-
运用LOADRUNNER .NET ADD-IN 写的性能测试脚本
2008-07-22 12:41:02
声明:这是转载文章,所有代码不是本人所写。
using System;
using System.Runtime.InteropServices;
using System.Data.OleDb;
using System.Data;
namespace LoadRunnerUser1
{
/// <summary>
/// Summary descrīption for VuserClass.
/// </summary>
[ClassInterface(ClassInterfaceType.AutoDual)]
public class VuserClass
{
LoadRunner.LrApi lr;
public VuserClass()
{
// LoadRunner Standard API Interface :: DO NOT REMOVE!!!
lr = new LoadRunner.LrApi();
}
// ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
public int Initialize()
{
// TO DO: Add virtual user's initialization routines
lr.message("Initialize部分,我只执行一次哦!");
return lr.PASS;
}
// ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
public int Actions()
{
// TO DO: Add virtual user's business process actions
lr.message("Actions部分,我可以重复执行(在设置迭代情况下)!");
try
{
//设置连接字符串开始
string strC;
[email=strConnection+=@]strConnection+=@"Data[/email] Source=C:\\test.mdb";
//设置连接字符串结束
//插入一个集合点开始
lr.rendezvous("集合点");
//插入一个集合点结束
//事务开始
lr.start_transaction("SQL语句性能");
//建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句开始
System.Data.OleDb.OleDbConnection conn=new
System.Data.OleDb.OleDbConnection(strConnection);
System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from testdb";
//建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句结束
//插入一个日志开始
lr.log_message("LOG: Sql语句开始执行了,Sql="+cmd.CommandText);
//插入一个日志结束
//将查询结果填充到DataTable开始
DataTable dt = new DataTable();
System.Data.OleDb.OleDbDataAdapter ōleDA = new
System.Data.OleDb.OleDbDataAdapter();
oleDA.SelectCommand = cmd;
oleDA.Fill(dt);
//将查询结果填充到DataTable结束
//插入一个日志开始
lr.log_message("LOG: Sql语句执行完成,Sql="+cmd.CommandText);
//插入一个日志结束
//取得结果集的记录数
int iCountRec=Convert.ToInt32(dt.Rows.Count.ToString());
conn.Close();//关闭连接
//如果记录数大于0,完整这个事务,否则标识事务失败
if(iCountRec>0)
lr.end_transaction("SQL语句性能",lr.PASS);
else
lr.end_transaction("SQL语句性能",lr.FAIL);
//再来一个参数化的示例开始
lr.output_message("Welcome "+lr.eval_string("<username>")+"!");
//再来一个参数化的示例结束
//Thinktime 的应用,就是模拟手工操作的延时,在这里我们延时3秒钟
lr.think_time(3);
}
catch(Exception ex)
{
conn.Close();//关闭连接
string error = ex.Message;
}
return lr.PASS;
}
// ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
public int Terminate()
{
// TO DO: Add virtual user's termination routines
lr.message("Terminate部分,我只执行一次哦!");
return lr.PASS;
}
}
} -
C#中的函数重载
2007-12-24 15:31:32
先来看一下代码:
using System;
using System.Collections.Generic;
using System.Text;namespace ChBurden
{
class Program
{
//所定义的类型是int的myStatic函数:
static int myStatic(int[] comeInt)
{
int keepInt;
keepInt = comeInt[0];for (int i = 1; i < comeInt.Length; i++)
{
if (comeInt[i] > keepInt)
{
keepInt = comeInt[i];
}
}Console.WriteLine("以上是Int的输出");
return keepInt;
}//所定义的类型是double的myStatic的函数:
static double myStatic(double[] comeDouble)
{
double keepDouble;
keepDouble = comeDouble[0];for (int i = 1; i < comeDouble.Length; i++)
{
if (comeDouble[i] > keepDouble)
{
keepDouble = comeDouble[i];
}
}Console.WriteLine("以上是Double的输出");
return keepDouble;
}
static void Main(string[] args)
{
//被声明int类型的:
int[] myInt ={25,87,65,100,325,56,987,102};
//被声明double类型的:
double[] ōkDouble = {51102,23548,98710,3548,21456,56871};
double myDouble;//由于myInt是int类型,所以会选择第一个myStatic的函数
myDouble = myStatic(myInt);
Console.WriteLine("{0}",myDouble);//由于okDouble是double类型,所以会选择第二个myStatic的函数
myDouble = myStatic(okDouble);
Console.WriteLine("{0}",myDouble);
Console.ReadKey();
}
}
}
说明如下:
在上述的代码中,采用的是函数重载的方法进行处理.原理是:多个函数采用相同的函数名,但所定义的类型和所定义的形参不相同,当调用相应的代码时,会按照所传递的实参的类型而去定位所被调用的函数,而且也可以按照相参数的个数来进行定位. -
软件容易出现问题的地方
2007-12-17 16:57:10
有一天我老大开完会就对我说:公司要我们帮开发人员培训一下,主题是:软件中常出现错误的地方.我听了这句话后就觉得很模糊,不能理解它的意思,因为我不知道他是要我针对某个软件或程序来说还是针对所有软件来说,如果是针对某个软件或程序来说的话这也没有什么问题,但如果针对所有软件来说的话,那我真是不知道怎么说了.不同的软件有不同的功能和特性,也有不同的操作方式,而且业务性质也不尽相同,所以要让我说出这些软件容易出现问题的地方那真是难透了,再说我才刚毕业,经验还没到家啊。
就在这时候,我想了一想,虽然每个软件有不同的功能,特性和操作方式,但它们彼此之间也有一些共同点,不过我理解的是,这些共同不是在一些细节上面,如输入框,按钮之类的,而是一种比较概念化的理解上,而要理解透也是很简单,那就是:业务,性能,边界值和等价类。(声明:下面我所说的是我自已的个人观点而已,不代表所有人的立场。)
业务我想所有人都应该很容易理解了,如果软件的业务功能达不到需求上所规定的要求那样的话,这根本就不能再继续执行测试,只能打回给开发部再进行修改,我想这个缺陷毫无疑问是最严重的吧,如果这个软件已开发到后期的时候,不知道已经浪费了多少人力资源了。能够发现业务问题的可以使用因果图法。
然后就是性能,每个软件都有它的性能,特别是对于C/S和B/S结构的软件来说,它的服务端的性能就是我们要测试的重点了,当然也不能把客户端的忽略掉。所以从这点看出,性能也是所有软件中所出现问题的共同点,不过性能问题有时也让人摸不着头脑的,例如:如果有一个服务端程序分别安装在两个配置不一样的服务器上面,可能得出的结果不尽相同,配置低一点的服务器响应的时间会比较长,而配置高一些的服务器的响应时间可能会很短从而达到需求所规定的时间;又或者在不同网络的情况下来对服务端进行性能测试,得到的结果也不一样(网络堵塞或者网络畅通的情况下);这样我们可能就会这样问:那系统到底达到要求没有啊?其实我说这个东西啊,就要看当初需求上所对服务器的配置和不同因络的情况下所规定下来所决定的,如果在规定配置的服务器上达不到所规定的响应时间的话,那毫无疑问这个程序是存在性能问题了,而如果所发现的性能问题是难以修改或会耗费比较大的资源的话,那就可以和用户沟通来提高服务器的硬件配置来解决性能上的问题。还有就是网络吞吐量的问题,这个一定要在需求上有所规定,如在网络畅通的情况下最大的响应时间是多少,而在网络堵塞的情况下系统最大的响应时间又是多少,或者在大量用户并发的情况下系统的响应最大时间又是多少,如果在当初的需求上没有作出相应的规定话,那到问题出现时就可能会争论不休了。
最后就是边界值和等界类了,每个软件都有一定的输入边界和输入范围,而有时程序员可能因为其他原因而会忽略这两点,所以一些教程上经常会说边界值和等价类是最容易发现问题的测试方法,我在工作中也用这两种方法发现过不少问题,这个我就不多说了,因为我想每个测试人员都会知道这一知识点的。
说到这里,我也觉得自已很烦,不知道为什么要对这个问题写一篇这样的文章,其实这个问题是不重要的,对于我们来说,最重要的说要发现问题,而且要找出所出现问题的原因。
-
工作6个月后.............
2007-12-05 17:16:27
哈哈,已经从事测试工作已经有6个多月了,说起来不长也不短,作为一个新手的我可以这样说,非常的不幸,我居然进了一个管理比较杂乱的公司,我所说的管理就是软件质量的管理.这样的话就更不用说有测试部门的,当初来公司的时候只有我一个做测试,之前是还有一个测试人员的,不过都跳了,为啥呢?这个就多方面的原因了,哈哈.工资也不多,试用只有1200,现在按提成最多也只有1700左右,不过看了这个数字不要被吓了一跳,说为什么会那低?怎么生活?放心,我工作的地方是广东省中山市,消费不比上海和北京那么高,吃一顿快餐也只要5块钱左右.
再说一下我现在的情况吧,虽然没有一套很好的管理制度,也没有一个正规的测试部门,而且有时候的测试工作所给的时间不合理,也曾经因为时间问题而没有写测试用例去直接做测试,更不用说有版本这个概念了,但我在这里的工作也比较愉快的,有时候忙的要命,有时候闲的要命,忙的时候就不停的去测试,闲的时候就不停的学习,哈,过的也不错,我也比较喜欢.
我的目标就是要向白盒测试性能测试发展,所以现在就开如学习开发知识,先做白盒吧,这样不但对做性能测试有好处,也能提高自已的开发能力,说不定有一天会跑去开发部做开发呢.