LoaderRunner常用函数

本文档提供了QTP和LoadRunner使用的详细技巧,包括如何调整QTP脚本运行速度、解决特定元素录制问题、高效操作关键字视图、集成屏幕截图、清理数据表数据、实现用户登录参数化、及LoadRunner中高级功能的应用等。

QTP使用问题集锦

对脚本的运行速度进行设置 - by Viajar

TOOLS->OPTIONS->RUN->RUN MODE 设置就可以了;一般可以设置为500或者1000值,也就是毫秒;

 

使用QTP录制XQP/OA时的更多按钮不能被录制到的解决 - by Viajar
方法一:使用Analog录制模式录制,点击了更多中的按钮是无法刷新页面的;
方法二:tools->virtual objects->new virtual objects->选取控件,这个方法还是无效;
方法三:在QTP的tools->web event recording configuration->custom settings->webelement->event->add->onmouseover & click & onmousedown 等几个,还是无法录制XQP和OA中的更多按钮;
方法四:在QTP的option->web->advanced->record setting->Record Navigate for all navigation operations使用了还是无法录制;
解决方法五:在QTP的option->web->advanced->record setting->User standard Winsows mouse events,结果可以录制,回放了,但是在录制过程中要注意登陆的时候不能输完密码后马上按回车,这样回放时会停留在登陆那里,应该使用鼠标来点击登陆;而且在录制完关掉IE时会报内存错误;

 

在KEYWORD VIEW模式下快速操作树 - by Viajar
在VIEW中使用EXPAND ALL/COLLAPSE ALL可以对树形ACTION进行展开和收缩;

 

QTP录制过程加入screen - by Viajar
点击Tools-Options-Run-Save movice to results-Always就可以把screen放到报告中,这样做会造成运行时很慢,CPU占用率100%,而且报告文件很大,在Res中可以看到屏幕的操作过程,相当于屏幕扑捉专家工具来录制,不知道有没办法解决CPU占用过大的问题?可否选择录制文件的格式类型?可否选择录制的帧数?解决CPU的方法大概可以为:录制时并不是马上写到文件中,而是写到内存中,跑完以后在写到文件中;可以多开一个线程或进程来分开两个的操作;(猜想而已。。。)

 

如何干净删除Data Table数据 - by Viajar
解决方法一:我按Del就删除了数据,但是RUN的时候却还是会继续去读取那些删除的数据,后来发现Data Table的表格有点差异,因为在删除的行上的边框还是深色的,这就说明只是删掉了数据,但是却没有把这些行也从中删除:
解决方法二:选择已经删除的行,点击右键->EDIT->CLEAR->ALL/FORMATS,就可以完全清除了,但是当修改行高时会重现边框线;
解决方法三:选择已经删除的行,点击右键->EDIT->CLEAR->DELETE,这样就可以了,也不会出现方法二的边框线了;

 

IE记住密码问题解决 - by Viajar
取消IE中的自动完成功能,不要让浏览器帮你自动输入帐号与密码,以确保在录制的过程中,所有的操作都会被录制下来,IE->工具->IE设置->内容->自动完成->表单上的用户名密码;

 

报告中一般只会在出错的时候才会在Details加入图片的解决方法 - by Viajar
报告中一般只会在出错的时候才会在Details加入图片,PASS的就没有了,一开始以为在报告中有选项可以设置,但是找了半天没找到,LOUIS也有遇到这个问题;
解决方法:后来想了一下,根据LR的经验,QTP在RUN就生成了报告,那么报告应该是RUN中设置的,所以最后在TOOLS->OPTIONS->RUN->SAVE STILL IMAGE CAPTURES TO RESULTS 选择 ALWAYS就可以解决问题了;

 

Action之间的嵌套 - by Viajar
口述:
1:Action之间的嵌套是为了解决循环操作的问题,也就是使用参数化更大范围的测试系统,因为在录制脚本的时候是默认把所有的操作都放到一个Action里面的;
2:比较有用的脚本是这样的,比如Action1里面嵌套一个Action1_1,再有一个Action2与Action1是平级的,那么在Action1就可以解决多个帐号登陆,Action1_1就解决某个属性值的多个值测试,Action2就可以录制为退出系统;
3:注意对不同的Action使用不同的Run模式,就是对着Action点击右键设置就可以了;
4:这还是一个比较简单的脚本,因为业务逻辑是比这个要复杂的多的;

 

一个比较完整的QTP脚本例子 - by Viajar
这是一个使用QTP录制BID的例子,其中包括:
1:Checkpoint(检测点);
2:Parameter(参数化);
3:Output(输出参数);
4:Action切割;
5:Action嵌套;
6:RUN时间控制;
7:VBScript使用;
8:DataTable处理(如何干净删除DataTable数据);

 

 

 

 

LoadRunner使用遇到的问题集锦

把HTML的内容输出到LOG中的方法 - by Viajar

1:在脚本要记录HTML的URL前面加入函数:web_create_html_param("MyHtml", "<html>", "");;
2:在脚本要记录HTML的URL后面加入函数:lr_output_message("###the HTML is %s", lr_eval_string(" {MyHtml}"));;
3:在Controller中设置Run-Time Settings,把log设置为Always Send Message;
4:在Controller中设置Run-Time Settings,把Miscellaneous设置为在发生错误时继续运行(在这里不是必须);
5:在Controller中设置Run-Time Settings,把Preferences设置为Enable image and text check;(在这里不是必须);
6:在Controller的日志文件RES中可以查看到每个虚拟用户的LOG;


如何在Controller中添加系统资源检测 - by Viajar

今天早上突然想把Windows的性能监视放到LR中,达到方便快捷的目的,下面的是具体的步骤:
1:使用192.168.0.159作为监控的对象,开通Remote Procedure Call和Remote Registry两个服务,Remote Registry一般都是给禁止的,可以改为手动并启动;
2:在159中右击我的电脑,选择管理->共享文件夹->共享 在这里面要有C$这个共享文件夹;
3:在159中使用命令netstat /ano查看445端口是否被打开;
4:输入\\192.168.0.159\c$ ,再输入用户名和密码,如果能进入c盘,那就说明有控制权了;
5:在Controller的Run中找到Windows Resources,对图点击右键中的Add Measurements,添加计数器;
6:需注意159机上的BlackIce;
7:对Windows Resources Graph的技巧使用,可以冻结窗体,导出HMTL,显示某个计数器等;

 

对ANALYSIS中不能导出页面细分下的子项的问题的处理方法 - by Viajar

1:问题描述:对ANALYSIS的导出WORD功能中只能导出树中的图表,在页面细分中点击不同的节点会有不同的图表,但是却无法把所有节点的图表一起导出;
2:如果想生成Time to First Buffer Breakdown下面Login事务和Loading事务下的图表都导出来,方法就是新建两张Time to First Buffer Breakdown图表,在不同的下面点击图表,并修改名称;
3:在导出列表中选中要导出的图表:Time to First Buffer Breakdown-All && Time to First Buffer Breakdown-Login && Time to First Buffer Breakdown-Loading;
4:总结:虽然这样做有点麻烦,但是比之前点击每个图再导出一个WORD来有用的多,但是LR可以做到在导出列表中以树的形式显示可以导出的图表,不过LR要解决图表没有名称的问题;

 

在中文版Analysis中显示系统资源图的原因与解决 - by Viajar

1:是否可以通过修改ACCESS记录来修改这个BUG??
2:不知道它添加图表的列表是不是通过数据库LOAD的?? 迄今还没有找到这些记录,只找到资源图表数据;
3:解决办法1:是用VNC截图,但是这样只能看到计数器曲线,没什么意义;
4:解决办法2:在Controller中导出系统资源数据,里面有量化数据,比较真实,不过每个场景都要导出一次就很麻烦,并且不好管理,无法对数据进行帅选和合并,如果打开导出的页面有乱码,那就在编码方式选择"自动选择";
5:解决办法3:使用英文版生成的ANALYSIS,再拿到中文版下面,是可以看到系统资源这个图表的,其实我应该早想到这样的,因为在中文版下无法显示不是Analysis的错,而是Controller的错,Analysis里面是包括ACCESS和其它包含系统资源的记录的,所以在中文版是能显示的;

 

终于使用LR实现了不同虚拟用户使用不用的帐号登陆,实行不同用户并发的问题 - by Viajar

1:在脚本设计中添加参数,参数名称为LoginUserName,选择参数类型为FILE;
2:很关键的一步就是:选者UNIQUE和EACH ITERATION/ONCE;
3:在脚本中把登陆名改为参数名;
4:使用Controller进行测试,在运行时设置LOG记录;
5:查看LOG,可以看到每个虚拟用户是使用不同的帐号登陆的;
6:总结:使用SEQUENTIAL会使得参数每次出现的地方的值都不一样;如何想使用更多用户的登陆可以使用参数数据库化;

 

LR参数数据库化(姑且这么叫,就是参数的来源于数据库)实践 - by Viajar

1:以XQP登陆帐号为例,把bw_Users表中的UserName做为参数LoginUserName的值;
2:过程都比较简单,需要注意的是使用FILE参数类型,参数值列表中的值只有100个,其它的可以通过Edit with Notepad查看;
3:在Update Value on 中有以下几个选项:
Each Occurrence:在运行时,每遇到一次该参数,便会取一个新的值;
Each iteration:运行时,在每一次循环中都取相同的值;
Once:运行时,在每次循环中,该参数只取一次值;
可以看出,是按照从脚本小范围到大范围的选择;
4:在Select next row 有以下几种选择:
Sequential:按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取;
Random:在每次循环里随机的读取一个,但是在循环中一直保持不变;
Unique :唯一的数。注意:使用该类型必须注意数据表有足够多的数;
Same Line As 某个参数(比如Name):和前面定义的参数Name 取同行的记录;通常用在有关联性的数据上面;
可以看出,是和循环(迭代)很有关系的;

 

发现可以对参数数据库化的数据进行作弊,作弊方法如下: - by Viajar

1:使用数据库管理器导出想要的数据为EXCEL;再保存为dat文件,再参数设置里面引用该文件;
2:在脚本文件夹中找到[参数名].dat文件;
3:对[参数名].dat文件进行编辑,把EXCEL中的数据拷贝到dat文件中;
4:进入脚本编辑,查看参数,可以见到刚刚拷贝的数据;
总结:虽然这个方法没什么很大用处,但是在无法使用VUGenerator连接数据库的时候就非常有用;

 

 

 

 

LoaderRunner常用函数 作者:张晶    文章来源:Blog    点击数:    更新时间:2007-4-23    

 

 1 编译错误提示:“not writing pre_cci.ci”,是脚本语法错误。

命令行函数(Command Line Parsing Functions

2.得到命令行传来的参数lr_get_attrib_double

信息函数(Informational Functions

3应用Timer
在事务中用lr_start_timer lr_end_timer 计算检查点所花费的时间。然后用lr_wasted_time把它从事务时间中减去 “sampleTrans” .

double time_elapsed, duration, waste;
merc_timer_handle_t timer;
       lr_start_transaction(”sampleTrans”);
       web_url(”index.htm”,
              ”URL=http:
//localhost/index.htm”,
              ”TargetFrame=”,
              ”Resource=0″,
              ”RecContentType=text/html”,
              ”Referer=”,
              ”Snapshot=t1.inf”,
              ”Mode=HTML”,
              LAST);
       timer = lr_start_timer();
/**//* Do some checks the duration of which
is not to be included in the transaction. */

       web_image_check(”ImgCheck1″,
              ”src=index_files/image002.jpg”,
              LAST);
       web_image_check(”ImgCheck2″,
              ”src=index_files/planets.gif”,
              LAST);
// How long did the tests take in seconds.
       time_elapsed = lr_end_timer(timer);
// Convert to millisecond.s
       waste = time_elapsed * 1000;
/**//* Remove the time the checks took from
       the transaction. */

       lr_wasted_time(waste);
        lr_end_transaction(”sampleTrans”, LR_AUTO); 

 

4LR Example: lr_get_transaction_duration
In the following example, the lr_get_transaction_duration function checks the duration of part of a transaction, and sends it to the Output window.

double trans_time;
int status;
lr_start_transaction (”Flight”);
web_url(”home;sz=234×60;tile=1;ord=977672495775323400″,
          ”URL=http:
//ad.doubleclick.net/…ord=977672495775323400″,
          ..
          ”Mode=URL”,
          LAST);
// Get transaction time to this point
trans_time=lr_get_transaction_duration(”Flight”);
status = web_submit_data(”flight”,
“Action=http:
//www.mercury-tours.com/cgi-bin/tours?ITN_RESPONSE+”,
“Method=POST”,
“TargetFrame=”,
…              
LAST);
/**//* End transaction with operation result - pass or fail */
if (status == 0)
lr_end_transaction(”Flight”, LR_PASS);
else
lr_end_transaction(”Flight”, LR_FAIL);
if (trans_time)
lr_output_message(”The duration up to the submit 
is %f seconds”, trans_time);
else
lr_output_message(”The duration cannot be determined.”); 


5
Sleep函数

Microsoft's Windows API,win32命令,Sleep函数的单位是ms

 

sleep(1000);

 

6lr_user_data_point  

lr_user_data_point 方法允许你录制自己的数据以供分析. 每次你要录制一个点的时候, 用这个函数录制取样的名称和值. LoadRunner 自动录制被录制的取样时间. 在场景执行之后, 你可以用 LoadRunner User Defined Data Points graph 去分析结果.

 

7lr_whoami()

int id, scid;
char *vuser_group;

lr_whoami(&id, &vuser_group, &scid);
lr_message( "Group: %s, vuser id: %d, scenario id %d", 
        vuser_group, id, scid);

8lr_user_data_point_instance

9lr_vuser_status_message

//Controller监视窗口中显示当前参数值和当前vu迭代次数,在vugen调试窗口中不会显示出来
lr_vuser_status_message("Para is:%s,%dTimes Iteration",lr_eval_string("{NewParam}"),++iteration);
return 0;
}

10lr_continue_on_error (int value);

“runtime setting”中设置 Continue on Error.如果执行中遇到错误脚本将继续运行.  如果一段脚本前后加入lr_continue_on_error,在这段脚本中遇到错误脚本会停止运行

lr_continue_on_error (0); 
    web_url("MercuryWebTours", 
       "URL=http://localhost/MercuryWebTours/", 
       "Resource=0", 
       "RecContentType=text/html", 
       "Referer=", 
       "Snapshot=t12.inf", 
       "Mode=HTML", 
       LAST);
lr_continue_on_error (1);

11Lr_abort()   Aborts Vuser script execution.

lr_exit (int continueint exit_status);   Exits from the script, action, or iteration. 
 
vuser_init() 
...{

     
int status = ftp_logon("FTP", "URL=ftp://user:pwd@ftp.merc-int.com",                "LocalAddr=ca_server:21", "ClientCert=/ca/pem/", 
               "ClientKey=/ca/pem/key/", "ClientPassword=@3#$8800cvd",
               "CertificateAuthority=/ca/", "SSLVersion=SSL2", LAST); 

     
if (status == LR_FAIL) ...{

          lr_error_message ("ftp login failed");
          lr_exit(LR_EXIT_VUSER, LR_FAIL);
     }

     
return(0);
}

 

<think>好的,用户现在想查找unittest的常用方法,特别是Python中的列表。用户之前已经得到了关于unittest框架的详细解释,现在需要更具体的方法列表。首先,我需要回顾之前的回答和提供的引用内容,确保信息一致且补充新的内容。 首先,在之前的回答中,已经提到了核心组件,比如TestCase类、断言方法、TestSuite和TestRunner,以及Mocking。用户现在需要的是具体的常用方法列表,可能需要更详细的分类和示例。 查看用户提供的引用,引用[1]和[2]展示了基本的断言方法如assertIn和assertEqual,引用[3]提到了如何组织测试套件,使用addTest和makeSuite,引用[4]提到了生成HTML报告的方法。这些都需要整合到回答中。 用户的问题是关于unittest常用方法,所以需要将方法分类,比如断言方法、测试组织方法、测试运行方法、Mock方法等。每个类别下列举常用方法,并给出示例代码,如用户提供的引用中的代码片段。 需要注意用户可能对如何组织多个测试用例、如何运行测试套件以及如何生成报告感兴趣,这些在引用[3]和[4]中有涉及。特别是生成HTML报告的部分,可能需要详细说明如何使用HTMLTestRunner,虽然这不是unittest本身的方法,但属于常用扩展。 另外,用户可能希望知道如何跳过测试或条件跳过,这在之前的回答中没有提到,但属于常用方法,需要补充。同时,异常测试的方法,如assertRaises,也需要包括在内。 要确保回答结构清晰,分点列出,每个方法有简要说明和示例代码,并注明引用来源。例如,断言方法部分可以引用[1][2],测试组织引用[3],报告生成引用[4]。同时,要检查是否有遗漏的方法,如setUp和tearDown,这些是TestCase的常用方法,用于初始化和清理环境。 最后,生成相关问题,可能涉及如何组织测试、优化测试结构、生成报告或与其他框架对比,这些问题需要自然引出,帮助用户进一步学习。</think>### `unittest` 常用方法列表(Python) 以下是 `unittest` 框架的核心方法分类及示例,涵盖断言、测试用例管理、Mock 操作和扩展功能。 (参考引用内容整合,部分代码示例来自引用[1][2][3][4]) --- #### 一、**断言方法** 用于验证代码逻辑是否符合预期,所有断言方法继承自 `unittest.TestCase`。 | 方法名 | 作用 | 示例代码 | |---------------------------------|--------------------------------------|--------------------------------------------------------------------------| | `assertEqual(a, b)` | 验证 `a == b` | `self.assertEqual(1+1, 2)` [^2] | | `assertTrue(x)`/`assertFalse(x)`| 验证 `x` 为真/假 | `self.assertTrue('foo' in {'foo', 'bar'})` | | `assertIn(a, b)` | 验证 `a` 在容器 `b` 中 | `self.assertIn('e', 'hello')` [^1] | | `assertRaises(Exception)` | 验证代码块抛出指定异常 | `with self.assertRaises(ZeroDivisionError): 1/0` [^2] | | `assertAlmostEqual(a, b)` | 验证浮点数近似相等(默认精度7位小数)| `self.assertAlmostEqual(0.1 + 0.2, 0.3)` | --- #### 二、**测试用例组织方法** 用于管理测试类和测试套件。 | 方法/类名 | 作用 | 示例代码 | |-------------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------| | `unittest.TestSuite()` | 创建测试套件 | ```suite = unittest.TestSuite()``` [^3] | | `suite.addTest()` | 向套件中添加单个测试用例 | ```suite.addTest(Test1('test_method1'))``` [^3] | | `unittest.makeSuite()` | 将某个测试类的所有方法加入套件 | ```suite.addTest(unittest.makeSuite(Test1))``` [^3] | | `unittest.TestLoader()` | 自动发现并加载测试用例(替代 `makeSuite`) | ```loader = unittest.TestLoader()<br>suite = loader.loadTestsFromTestCase(Test1)``` | --- #### 三、**测试运行与报告生成** 执行测试并生成结果。 | 方法/工具 | 作用 | 示例代码 | |-----------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------| | `unittest.main()` | 默认运行当前模块的所有测试 | ```if __name__ == '__main__': unittest.main()``` [^2] | | `TextTestRunner` | 生成文本测试报告 | ```runner = unittest.TextTestRunner()<br>runner.run(suite)``` [^3] | | `HTMLTestRunner` | 生成 HTML 格式测试报告(需第三方库 `HTMLTestRunner`) | ```with open('report.html', 'wb') as f:<br> runner = HTMLTestRunner(f)<br> runner.run(suite)``` [^4] | --- #### 四、**Mock 与依赖隔离** 通过 `unittest.mock` 模块模拟外部依赖。 | 方法/类名 | 作用 | 示例代码 | |--------------------------|----------------------------------------------------------------------|--------------------------------------------------------------------------| | `unittest.mock.Mock()` | 创建模拟对象 | ```mock_db = Mock()<br>mock_db.query.return_value = ['data1', 'data2']``` | | `@patch` 装饰器 | 临时替换对象属性或函数 | ```from unittest.mock import patch<br>@patch('module.function')``` | --- #### 五、**其他实用方法** | 方法名 | 作用 | |----------------------------|----------------------------------------------------------------------| | `setUp()`/`tearDown()` | 在每个测试方法前/后执行(初始化/清理资源) | | `setUpClass()`/`tearDownClass()` | 在整个测试类执行前/后运行(需搭配 `@classmethod` 装饰器) | | `@skip(reason)` | 跳过某个测试方法 | | `@skipIf(condition)` | 根据条件跳过测试 | --- ### 完整代码示例 ```python import unittest from unittest.mock import Mock class ExampleTest(unittest.TestCase): @classmethod def setUpClass(cls): print("初始化全局资源") def setUp(self): print("初始化测试环境") def test_addition(self): self.assertEqual(2 + 2, 4) # 基础断言 def test_mock(self): mock_service = Mock() mock_service.get_data.return_value = [1, 2, 3] self.assertIn(2, mock_service.get_data()) # 模拟外部服务 @unittest.skip("跳过示例") def test_skip(self): self.fail("此测试不会执行") def tearDown(self): print("清理测试环境") if __name__ == '__main__': unittest.main() ``` --- ### 相关问题 1. 如何通过 `unittest` 实现参数化测试? 2. `unittest.mock` 如何模拟网络请求或数据库连接? 3. 如何将 `unittest` 与持续集成工具(如 Jenkins)结合使用? 4. `pytest` 相比 `unittest` 在断言语法上有哪些改进?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值