51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 9265|回复: 46
打印 上一主题 下一主题

[原创] 虚拟500个用户同时对数据库进行插入操作,每个用户循环插入30条数据。该怎么设计呢

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-5-1 16:31:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 bustersword 于 2011-5-5 09:47 编辑

我的脚本是单用户登陆系统并插入2张图片,然后注销,
然后我迭代插入的action15次。什么参数化,关联,搞好后,我就放到controller中了,虚拟500个用户,直接运行- -
然后结果就是数据库了只进入了1000多条数据,理论上应该有15000条数据的.......我感觉是时间太紧凑了,用户之间的操作,来不及响应?
我也设置thinktime的,难道没用么?
大大们给点帮助,谢谢了,第一次用loadrunner测试系统.....实在没办法老大突然叫测性能,我了个去,叫我一个开发的做测试,还好以前摸过loadrunner,不过也只是鸡毛蒜皮,实在没办法,求助大大们,帮帮忙

以上的 丢失 ,我通过改写脚本,不会出现这么大量的丢失了,是我脚本每写好的原因,现在的问题是我下面遇到的。。。请大家看接下去回答的部分,需要翻页,真不好意思 19楼往下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

47#
 楼主| 发表于 2011-5-11 11:31:25 | 只看该作者
回复  bustersword


    你用了什么监控数据库啊?
wyh1987com 发表于 2011-5-9 17:22



    其实,我没用什么监测数据库,只是看了下数据库日志而已。。。。目前困扰在怎样提升性能
回复 支持 反对

使用道具 举报

该用户从未签到

46#
发表于 2011-5-10 11:10:13 | 只看该作者
另外勾选专家模式和不勾选,有什么区别呢。我测出来的结果是不同的
回复 支持 反对

使用道具 举报

该用户从未签到

45#
发表于 2011-5-10 11:09:47 | 只看该作者
本帖最后由 sherryshi 于 2011-5-10 11:15 编辑

如果我要测的是查询,插入,提交这样的业务类型,设置思考时间好呢,还是不设置好呢?
回复 支持 反对

使用道具 举报

该用户从未签到

44#
发表于 2011-5-10 11:02:53 | 只看该作者
回复  sherryshi


    思考时间,打个比方,你登陆QQ时,需要输入用户名密码,这个输入时间就是thinkt ...
lmzkuaipao 发表于 2011-5-9 15:13



    谢谢详细解答
回复 支持 反对

使用道具 举报

该用户从未签到

43#
发表于 2011-5-9 17:22:52 | 只看该作者
回复 40# bustersword


    你用了什么监控数据库啊?
回复 支持 反对

使用道具 举报

该用户从未签到

42#
发表于 2011-5-9 15:13:23 | 只看该作者
回复 29# sherryshi


    思考时间,打个比方,你登陆QQ时,需要输入用户名密码,这个输入时间就是thinktime。如果要测试登陆的响应时间,应该在点确认登陆前加transaction,登陆完毕后结束transaction。录制完毕后,把脚本里,transaction里面自动录制出来的thinktime删掉,手动在transaction之前加thinktime。什么时候设什么时候不设thinktime,要看你具体的测试要求了
回复 支持 反对

使用道具 举报

该用户从未签到

41#
发表于 2011-5-9 13:54:48 | 只看该作者
性能自动化的朋友请加群:146971792
zouhui1003it 发表于 2011-5-8 18:43



    群怎么加不了呢
回复 支持 反对

使用道具 举报

该用户从未签到

40#
发表于 2011-5-9 13:23:18 | 只看该作者
.....我想知道怎么解决服务器响应慢的问题。优化SQL语句,优化页面,and???????
bustersword 发表于 2011-5-9 10:24



    应该找出原因吧,我现在就急于求教如何分析是哪部分原因造成的
回复 支持 反对

使用道具 举报

该用户从未签到

39#
 楼主| 发表于 2011-5-9 10:24:09 | 只看该作者
.....我想知道怎么解决服务器响应慢的问题。优化SQL语句,优化页面,and???????
回复 支持 反对

使用道具 举报

该用户从未签到

38#
发表于 2011-5-6 17:16:46 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

该用户从未签到

37#
发表于 2011-5-6 15:45:13 | 只看该作者
恩,也顶一记,等待高人
回复 支持 反对

使用道具 举报

该用户从未签到

36#
 楼主| 发表于 2011-5-6 13:46:15 | 只看该作者
顶下,等待高手
回复 支持 反对

使用道具 举报

该用户从未签到

35#
 楼主| 发表于 2011-5-5 18:11:24 | 只看该作者
// 找到libmysql.dll的所在位置.
rc = lr_load_dll("C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\libmysql.dll");
if (rc != 0) {
    lr_error_message("Could not load libmysql.dll");
    lr_abort();
}

// 创建MySQL对象
db_connection = mysql_init(NULL);
if (db_connection == NULL) {
    lr_error_message("Insufficient memory");
    lr_abort();
}

// 连接到MySQL数据库
rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);
if (rc == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 向数据库插入数据
// 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替
lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 从数据库读取一个数据并显示
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_error_message("Did not expect the result set to be empty");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 保存参数,用于删除这行数据
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);

// 在事务里更新一行数据,需要用InnoDB引擎
rc = mysql_query(db_connection, "BEGIN"); //启动事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
// 使用 "FOR UPDATE" 锁住要更新的数据行
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_error_message("没有查询到结果");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
rc = mysql_query(db_connection, "COMMIT"); // 提交事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 再次查找数据,应该为空了,因为前面的事务更新了标志
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_output_message("Result set is empty as expected");
    mysql_free_result(query_result);
} else {
    lr_error_message("Did not expect the result set to contain any rows");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}

// 删除数据
lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 释放MySQL资源
mysql_close(db_connection);
return 0;
}


我想知道上面这段连接mysql测试的前提环境配置----------------------------------求解
回复 支持 反对

使用道具 举报

该用户从未签到

34#
 楼主| 发表于 2011-5-5 18:11:18 | 只看该作者
Action()
{
int rc;  
int db_connection; // 数据库连接
int query_result; // 查询结果集 MYSQL_RES
char** result_row; // 查询的数据衕
  
char *server = "localhost";
char *user = "root";
char *password = "123456";
char *database = "test";
int port = 3306;
int unix_socket = NULL;  
int flags = 0;  
  
// 找到libmysql.dll的所在位置.
rc = lr_load_dll("C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\libmysql.dll");
if (rc != 0) {
    lr_error_message("Could not load libmysql.dll");
    lr_abort();
}
  
// 创建MySQL对象
db_connection = mysql_init(NULL);
if (db_connection == NULL) {
    lr_error_message("Insufficient memory");
    lr_abort();
}
  
// 连接到MySQL数据库
rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);
if (rc == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 向数据库插入数据
// 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替
lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");  
rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 从数据库读取一个数据并显示
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL
result_row = (char **)mysql_fetch_row(query_result);  
if (result_row == NULL) {
    lr_error_message("Did not expect the result set to be empty");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 保存参数,用于删除这行数据
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
  
// 在事务里更新一行数据,需要用InnoDB引擎
rc = mysql_query(db_connection, "BEGIN"); //启动事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
// 使用 "FOR UPDATE" 锁住要更新的数据行
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");  
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);  
if (result_row == NULL) {
    lr_error_message("没有查询到结果");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
rc = mysql_query(db_connection, "COMMIT"); // 提交事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 再次查找数据,应该为空了,因为前面的事务更新了标志
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_output_message("Result set is empty as expected");
    mysql_free_result(query_result);
} else {
    lr_error_message("Did not expect the result set to contain any rows");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
  
// 删除数据
lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 释放MySQL资源
mysql_close(db_connection);
    return 0;
}
/*需要的表结构如下
CREATE TABLE `test_data` (
`order_id` BIGINT UNSIGNED NOT NULL COMMENT 'Order numbers. Must be unique.',
`status` BOOL NOT NULL DEFAULT '0' COMMENT 'Whether data has been used or not. A value of 0 means FALSE.',
`date_used` DATETIME NULL COMMENT 'Date/time that the data was used.',
UNIQUE (
    `order_id`
)
) ENGINE = innodb COMMENT = 'LoadRunner test data';
*/
Action()
{
int rc;
int db_connection; // 数据库连接
int query_result; // 查询结果集 MYSQL_RES
char** result_row; // 查询的数据衕

char *server = "localhost";
char *user = "root";
char *password = "123456";
char *database = "test";
int port = 3306;
int unix_socket = NULL;
int flags = 0;
回复 支持 反对

使用道具 举报

该用户从未签到

33#
 楼主| 发表于 2011-5-5 18:06:08 | 只看该作者
我真的很不厉害............是菜鸟,我现在是完全找不到东南西北
回复 支持 反对

使用道具 举报

该用户从未签到

32#
发表于 2011-5-5 17:47:19 | 只看该作者
我今天又测试了100用户*100数据,也就是一共插入10000条数据,丢失4条数据,但是保存数据的响应时间竟然达到 ...
bustersword 发表于 2011-5-5 17:29



    你已经很厉害了,呵呵

我更加迷茫,现在有一个功能点在多并发的情况下速度很慢,让我分析原因,是程序还是服务器还是数据库。姐姐我不知道怎么弄啊,分析不来呀,压力做了又做????
回复 支持 反对

使用道具 举报

该用户从未签到

31#
 楼主| 发表于 2011-5-5 17:29:16 | 只看该作者
我今天又测试了100用户*100数据,也就是一共插入10000条数据,丢失4条数据,但是保存数据的响应时间竟然达到了10S左右,我了个去......50用户插入750条数据,倒是3S内,现在至于要根据这些结果,让我去改程序,或者服务器,数据库,我还真是有点迷茫了..........天啊!
怎么搞负载均衡,什么分布式缓存,神马神马啊!
疯了
回复 支持 反对

使用道具 举报

该用户从未签到

30#
发表于 2011-5-5 10:50:37 | 只看该作者
再问个问题,如何排除应用服务器和程序,只对数据进行压力测试。这样的测试如何进行呢。我现在在做一个系统的压力测试,不知道怎么分析到底是程序问题,中间件问题,还是数据库问题?
回复 支持 反对

使用道具 举报

该用户从未签到

29#
发表于 2011-5-5 10:48:41 | 只看该作者
借楼主热帖问下,什么情况下设置思考时间,什么情况下不设置思考时间?另外这个思考时间指的是什么呢?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-25 12:30 , Processed in 0.076930 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表