[LoadRunner]LR函数小全
给出一部分常用的LoadRunner函数,供大家参考。
LR函数:
lr_start_transaction 为性能分析标记事务的开始
lr_end_transaction 为性能分析标记事务的结束
lr_rendezvous 在 Vuser 脚本中设置集合点
lr_think_time 暂停 Vuser 脚本中命令之间的执行
lr_end_sub_transaction 标记子事务的结束以便进行性能分析
lr_end_transaction 标记 LoadRunner 事务的结束
Lr_end_transaction("trans1",Lr_auto); lr_end_transaction_instance 标记事务实例的结束以便进行性能分析
lr_fail_trans_with_error 将打开事务的状态设置为 LR_FAIL 并发送错误消息 lr_get_trans_instance_duration 获取事务实例的持续时间(由它的句柄指定) lr_get_trans_instance_wasted_time 获取事务实例浪费的时间(由它的句柄指定) lr_get_transaction_duration 获取事务的持续时间(按事务的名称)
lr_get_transaction_think_time 获取事务的思考时间(按事务的名称) lr_get_transaction_wasted_time 获取事务浪费的时间(按事务的名称)
lr_resume_transaction 继续收集事务数据以便进行性能分析
lr_resume_transaction_instance 继续收集事务实例数据以便进行性能分析 lr_set_transaction_instance_status 设置事务实例的状态
lr_set_transaction_status 设置打开事务的状态
lr_set_transaction_status_by_name 设置事务的状态
lr_start_sub_transaction 标记子事务的开始
lr_start_transaction 标记事务的开始
Lr_start_transaction("trans1"); lr_start_transaction_instance 启动嵌套事务(由它的父事务的句柄指定)
lr_stop_transaction 停止事务数据的收集
lr_stop_transaction_instance 停止事务(由它的句柄指定)数据的收集
lr_wasted_time 消除所有打开事务浪费的时间
lr_get_attrib_double 检索脚本命令行中使用的double 类型变量
lr_get_attrib_long 检索脚本命令行中使用的 long 类型变量
lr_get_attrib_string 检索脚本命令行中使用的字符串
lr_user_data_point 记录用户定义的数据示例
lr_whoami 将有关 Vuser 脚本的信息返回给 Vuser 脚本
lr_get_host_name 返回执行
Vuser 脚本的主机名
lr_get_master_host_name 返回运行 LoadRunner Controller 的计算机名
lr_eval_string 用参数的当前值替换参数
lr_save_string 将以 NULL 结尾的字符串保存到参数中
lr_save_var 将变长字符串保存到参数中
lr_save_datetime 将当前日期和时间保存到参数中
lr _advance_param 前进到下一个可用参数
lr _decrypt 解密已编码的字符串
lr_eval_string_ext 检索指向包含参数数据的缓冲区的指针
lr_eval_string_ext_free 释放由 lr_eval_string_ext 分配的指针
lr_save_searched_string 在缓冲区中搜索字符串实例,并相对于该字符串实例,将该缓冲区的一部分保存到参数中
lr_debug_message 将调试信息发送到输出窗口
lr_error_message 将错误消息发送到输出窗口
lr_get_debug_message 检索当前消息类
lr_log_message 将消息发送到日志文件
lr_output_message 将消息发送到输出窗口
lr_set_debug_message 设置调试消息类
lr_vuser_status_message 生成带格式的输出,并将其写到 ControllerVuser 状态区域
lr_message 将消息发送到 Vuser 日志和输出窗口 lr_load_dll 加载外部 DLL
lr_peek_events 指明可以暂停 Vuser 脚本执行的位置
lr_think_time 暂停脚本的执行,以模拟思考时间(实际用户在操作之间暂停以进行思考的时间) lr_continue_on_error 指定处理错误的方法 lr_continue_on_error (0);lr_continue_on_error (1);
lr_rendezvous 在 Vuser 脚本中设置集合点
TE_wait_cursor 等待光标出现在终端窗口的指定位置
TE_wait_silent 等待客户端应用程序在指定秒数内处于静默状态
TE_wait_sync 等待系统从 X-SYSTEM 或输入禁止模式返回
TE_wait_text 等待字符串出现在指定位置
TE_wait_sync_transaction 记录系统在最近的 X SYSTEM 模式下保持的时间
WEB函数列表:
web_custom_request 允许您使用 HTTP 支持的任何方法来创建自定义 HTTP 请求
web_image 在定义的图像上模拟鼠标单击 web_link 在定义的文本链接上模拟鼠标单击 web_submit_data 执行“无条件”或“无上下文”的表单
web_submit_form 模拟表单的提交
web_url 加载由“URL”属性指定的 URL
web_set_certificate 使 Vuser 使用在 Internet Explorer 注册表中列出的特定证书 web_set_certificate_ex 指定证书和密钥文件的位置和格式信息
web_set_user 指定 Web 服务器的登录字符串和密码,用于 Web 服务器上已验证用户身份的区域 web_cache_cleanup 清除缓存模拟程序的内容
web_find 在 HTML 页内搜索指定的文本字符串
web_global_verification 在所有后面的 HTTP 请求中搜索文本字符串
web_image_check 验证指定的图像是否存在于 HTML页内
web_reg_find 在后面的 HTTP 请求中注册对 HTML源或原始缓冲区中文本字符串的搜索 web_disable_keep_alive 禁用 Keep-Alive HTTP 连接
web_enable_keep_alive 启用 Keep-Alive HTTP 连接
web_set_connections_limit 设置 Vuser 在运行脚本时可以同时打开连接的最大数目 web_concurrent_end 标记并发组的结束
web_concurrent_start 标记并发组的开始
web_add_cookie 添加新的 Cookie 或修改现有的 Cookie
web_cleanup_cookies 删除当前由 Vuser 存储的所有 Cookie
web_remove_cookie 删除指定的 Cookie
web_create_html_param 将 HTML 页上的动态信息保存到参数中。(LR 6.5 及更低版本) web_create_html_param_ex 基于包含在 HTML 页内的动态信息创建参数(使用嵌入边界)(LR 6.5 及更低版本)。
web_reg_save_param 基于包含在 HTML 页内的动态信息创建参数(不使用嵌入边界) web_set_max_html_param_len 设置已检索的动态 HTML 信息的最大长度
web_add_filter 设置在下载时包括或排除 URL 的条件
web_add_auto_filter 设置在下载时包括或排除 URL 的条件
web_remove_auto_filter 禁用对下载内容的筛选
web_add_auto_header 向所有后面的 HTTP 请求中添加自定义标头
web_add_header 向下一个 HTTP 请求中添加自定义标头
web_cleanup_auto_headers 停止向后面的 HTTP 请求中添加自定义标头 web_remove_auto_header 停止向后面的 HTTP 请求中添加特定的标头
web_revert_auto_header 停止向后面的 HTTP 请求中添加特定的标头,但是生成隐性标头 web_save_header 将请求和响应标头保存到变量中
web_set_proxy 指定将所有后面的 HTTP 请求定向到指定的代理服务器
web_set_proxy_bypass 指定 Vuser 直接访问(即不通过指定的代理服务器访问)的服务器列表 web_set_proxy_bypass_local 指定 Vuser 对于本地 (Intranet) 地址是否应该避开代理服务器 web_set_secure_proxy 指定将所有后面的 HTTP 请求定向到服务器
web_set_max_retries 设置操作步骤的最大重试次数
web_set_timeout 指定 Vuser 等待执行指定任务的最长时间
web_convert_param 将 HTML 参数转换成 URL 或纯文本
web_get_int_property 返回有关上一个 HTTP 请求的特定信息
web_report_data_point 指定数据点并将其添加到测试结果中
web_set_option 在非 HTML 资源的编码、重定向和下载区域中设置 Web 选项 web_set_sockets_option 设置套接字的选项
LoadRunner函数中文翻译系列之一--Action
2009年09月26日 星期六上午 09:45
web_url 语法: 语法: 语法: 语法: 语法: |
Loadrunner函数中文解释
2009年09月26日 星期六上午 09:49
web_url 语法: 返回值 参数: url:页面url地址。 List of Attributes EXTRARES:分隔符,标记下一个参数是资源属性的列表了。 List of Resource Attributes LAST:属性列表结束的标记符。 说明 Web_url根据函数中的URL属性加载对应的URL,不需要上下文。 只有VuGen处于URL-based或者HTML-based(此时A scrīpt containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。 可以使用web_url 模拟从FTP服务器上下载文件。web_url 函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。 在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。 通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。 所有的Web Vusers ,HTTP模式下的WAP Vusers或者回放模式下的Wireless Session Protocol(WSP),都支持web_url函数。 web_image 语法: 返回值 参数: List of Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALT、Frame、TargetFrame、Ordinal则是有的话会被录制到。 1、ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。 2、SRC:描述图象的元素,可以是图象的文件名. 如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。 3、Frame:录制操作时所在的Frame的名称。 4、TargetFrame:见List of Attributes的同名参数。 5、Ordinal:参见Web_link的同名参数。 List of Attributes(客户端映射的图片): 1、AreaAlt:鼠标单击区域的ALT属性。 2、AreaOrdinal:鼠标单击区域的顺序号。 3、MapName:图象的映射名。 List of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。 2、Ycoord:点击图象时的Y坐标。 EXTRARES:分隔符,标记下一个参数是资源属性的列表了。 List of Resource Attributes:参见List of Resource Attributes一节。 LAST:属性列表结束的标记符。 说明 web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。 在Toos—Recording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。 在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。 通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。 web_image支持Web虚拟用户,不支持WAP虚拟用户。 例子 下面的例子模拟用户单击Home图标以回到主页(黑体部分): web_url("my_home", "URL=http://my_home/", LAST); web_link("Employees", "Text=Employees", LAST); web_image("Home.gif", "SRC=../gifs/Buttons/Home.gif", LAST); web_link("Library", "Text=Library", LAST); web_image("Home.gif", "SRC=../../gifs/buttons/Home.gif", LAST); 下面的例子模拟用户在客户端映射的图片上单击: web_image("dpt_house.gif", "Src=../gifs/dpt_house.gif", "MapName=dpt_house", "AreaOrdinal=4", LAST); 下面的例子模拟用户在服务端映射的图片上单击: web_image("The Web Developer's Virtual Library", "Alt=The Web Developer's Virtual Library", "Ordinal=1", "XCoord=91", "YCoord=17", LAST); 下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif、/gifs/dpt_house.gif、gifs/dpt_house.gif、/dpt_house.gif等都会匹配到。 web_image("dpt_house.gif", "Src/sfx=dpt_house.gif", LAST); web_link 语法: 返回值 参数: List of Attributes:支持下列的属性: 1.Text:超链接中的文字,必须精确匹配。 2.Frame:录制操作时所在的Frame的名称。 3.TargetFrame、ResourceByteLimit:见List of Attributes一节。 4.Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:“SRC=abc.gif”,“Ordinal=3”标记的是SRC的值是“abc.gif”的第3张图片。 EXTRARES:表明下面的参数将会是list of resource attributes了。 LAST:结尾标示符。 说明 模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。 web_link 仅仅在基于HTML的录制方式中才会被VuGen捕捉到。 非HTML生成的资源的例子有.gif 和.jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording --HTML-based scrīpt-- Record within the current scrīpt step选项被选中时,它们才会被插入到代码中。 可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。 此函数值支持Web虚拟用户,不支持WAP虚拟用户。 web_submmit_form 语法: 返回值 参数: 1.Action:Form中的ACTION属性,指定了完成Form中的操作用到的URL。也可以使用“Action/sfx” 表示使用此后缀的所有Action。 2.Frame:录制操作时所在的Frame的名称。 3.TargetFrame、ResourceByteLimit:见List of Attributes的同名参数。 4.Ordinal:参见Web_link的同名参数。 VuGen通过记录数据域唯一的标识每个Form。如果这样不足以识别Form,VuGen会记录Action 属性。如果还不足以识别,则会记录Ordinal 属性,这种情况下不会记录Action属性。 List of Hidden Fields:补充属性(Serves)。通过此属性可以使用一串隐含域来标识Form。使用下面的格式: STARTHIDDENS, "name=n1", "value=v1", ENDITEM, "name=n2", "value=v2", ENDITEM, ENDHIDDENS, List of Data Fields Data项用来标识form。Form是通过属性和数据来共同识别的。 使用下面的格式来表示数据域列表 "name=n1", "value=v1", ENDITEM, "name=n2", "value=v2", ENDITEM, ITEMDATA:Form中数据和属性的分隔符。 EXTRARES:一个分隔符,标记下一个参数是资源属性的列表了。 List of Resource Attributes:参见List of Resource Attributes一节。 LAST:属性列表结束的标记符。 说明 web_submit_form 函数用来提交表单。此函数可能必须在前一个操作的上下文中执行。在Toos—Recording Option,只有录制级别设为基于HMTL的录制方式,web_image才会被录制到。 在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。 通常情况下,如果录制了web_submit_form 函数,VuGen会把“name”和“value”一起录制到ITEMDATA属性中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。 例如:可以把 "Name=grpType", "Value=radRoundtrip", ENDITEM 改为:"Name=grpType", EncryptedValue=409e41ebf102f3036b0549c799be3609", ENDITEM 如果你完整的安装了LoadRunner,那么打开开始菜单--Mercury LoadRunner—Tools--Password Encoder,这个小工具是用来加密字符串的。把需要加密的值粘贴到Password一栏,再点Generate按钮。加密后的字符串会出现在Encoded string框中。接着点Copy按钮,然后把它粘贴到脚本中,覆盖原来显示的“Value”。 加密的另一种方法时使用lr_decrypt函数。方法:选择整个字符串,例如“Value=radRoundtrip”(注意不要选择引号),右击鼠标,选择Encrypt string选现,脚本会变为: "Name=grpType", lr_decrypt("40d176c46f3cf2f5fbfaa806bd1bcee65f0371858163"), ENDITEM, web_submit_form支持Web虚拟用户,不支持WAP虚拟用户。 例子: 下面的例子中,web_submit_form 函数的名字是“employee.exe”。此函数提交了一个请求,此请求包含雇员信息John Green。此函数没有使用属性(Attributes)是因为通过数据项已经能唯一的标识这个Form了。 |
LoadRunner参数化
2009年09月25日 星期五下午 02:22
一、关于参数的定义 拟用户和迭代回放脚本时,也许你不想重复使用相同的值“ 软件测试”,还需要其他的值如“项目管理” 。例如平常经常用到的,登陆界 面输入用户名和密码,那么,你就可以用参数来取代这个常量。结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个文 件,也可以是内部产生的变量。 的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。 中创建参数。或者,也可以在基于图标的树形视图中创建参数。 你自己的格式。这个格式应该和你脚本中录制的 Date/Time 格式保持一致。你可以设置一个时间参数的偏移量,如果你打算测试下个月的日 期,你就可以选择偏移量为30。你也可以设置前偏移量和后偏移量,默认的是前偏移量。另外你可以命令vguen在工作日使用date值,不包括 周六和周日(没有明白这个的具体用处,明白的请告知)。 2 )、 Group Name Group Name 用虚拟用户组名称替换参数。在创建 scenario 的时候,你可以指定虚拟用户组的名称。当从用户脚 本生成器运行脚本的时候,虚拟用户组名称总是 None 。 脚本生成器运行脚本的话,虚拟用户的 ID 总是 -1 *x2) {return "Ver2.0";} 9、table或file 从已存在的数据库中导入文件 书写 SQL 语句。在导入数据以后,以 .dat 为后缀并作为正规的参数文件保存。 。 记录以 data 文件的形式显示出来。 Virtual User Generator ”返回到脚本生成器。 、 Random 、 Unique 或者 Same Line As 。 在连接字符串框中显示出来。 、 Random 、 Unique 或者 Same Line As 。 脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。数据文件中的数据是以表的形式存储的 。一个文件中可以包含很多参数值。每一列包含一个参数的数据。列之间用分隔符隔开,比如说,用逗号。 对数据文件设置参数属性 如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式,包括列的分隔符、更新方法。 如果参数的类型是“ File” ,打开参数属性( Parameter Properties )对话框,设置文件属性如下: “parameter_name.dat” ,注意,已有的数据文件的后缀必须是 .dat 。 的表行开始一行新的数据。 注意:在没有启动记事本的情况下如果想添加列,就在参数属性对话框中点击“ Add Col” ,那么 “Add new column” 对话框就会弹出。输入新列的名称,点击 “OK” 。脚本生成器就会添加该列到表中,并显示该列的初始值。 示在每列的第一行( row 0 )。 “First data line” 中输入 1 。如果没有列标题,就输入 0 。 、唯一的、或者与其它参数表的相同行。 的数据。 子数值用于随机顺序。每一个种子数值在测试执行的时候代表了一个随机数的顺序。无论你何时使用这个种子数值,在 scenario 中同样的 数据顺序就被分配给虚拟用户。如果在测试执行的时候发现了一个问题并且企图使用同样的随机数序列来重复测试,那么,你就可以启动这 个功能(可选项)。 的列。在下拉列表中会出现定义过的所有参数列表。注意:至少其中的一个参数必须是 Sequential 、 Random 或者 Unique 。 旦 ID“132” 被使用,那么,姓名( Name ) “Kim” 和职位( Title ) “Manager” 同时被使用。 |
查看文章 |
web_find()和web_reg_find()
2009年09月26日 星期六上午 09:51
这两个函数均用于内容的查找,但两者也有本质的区别,具体介绍如下: |
LoadRunner脚本编写-- 检查点,关联等函数
2009年09月26日 星期六上午 09:51
1. 错误预防和恢复 参数默认是用{}括起来的,但也可以指定用<>51Testing软件测试网 NTLM或用户登录验证 web_set_user("X\\Y", "Z", "A.com:80"); 在域与X上的用户名为Y的用户,使用密码Z来登录到A.com:80。在windows基本验证的时候这个脚本被默认录制下来,但如果web服务器需要更安全的NTLM或更深层次的验证,需要手动的添加这个函数到脚本中。对于NTML验证,用户名必须在域名之后,并且以\分割。使用\等符号,需要使用\\,前面的\用来做转义用,否则会出现警告提示。 zibeike注:在论坛中也看到了一些朋友讨论windows弹出登录框的操作LR无法录制到,导致回放出错,一般出错信息多为“Error -26547: Authentication required, please use web_set_user, e.g. web_set_user("domain\\user", "password", "host:port"); [MsgId: MERR-26547]”,其实这种情况错误信息已经很明显的给你提示了,需要往脚本中添加web_set_user函数即可。 2. IP欺骗(略) 3. 验证检查点 通常脚本录制完后需要手动添加些脚本来来确保预期的操作确实进行了正确的响应(如在操作之后后验证显示的一段文本或者图片)。这些检查可以使用正则表达式。 Web虚拟用户脚本中不会录制到检查点,需要手动添加或者使用VuGen的用户接口来添加函数代码。 最常用的检查点函数是web_reg_find。这个注册函数会查找脚本中下一个操作如web_url后产生的一段文本。它是从返回的缓冲区扫描而不是在接收的页面中查找。这是比web_find更高效的一个函数。 可以使用下面的代码来验证文本出现的次数:
lr_output_message("not found"); else lr_output_message("{abc_count} found"); 如果想保存并且显示找到的文本,可以使用web_reg_save_param界定左右边界把找到的信息保存到参数中。如下:
lr_output_message("param found"); }else{ lr_output_message("Value found is %s",str2); } zibeike注:1)这里想跟大家说下注册函数,在web/http协议的脚本中,注册函数均以web_reg为前缀,这种注册型的函数都是从缓冲区扫描或者获得数据,因此需要提前声明即需要在能获得该查找信息的函数之前添加这些注册函数。例如,web_url()请求了一个页面,我需要验证该页面中是否有某个特定的文本,那需要在web_url()函数之前加上web_reg_find,类似的还有关联的函数web_reg_save_para是一样的,需要放到能获得想要的数据的请求的函数之前。但如果想查看这些函数最终保存的结果,如想打印关联函数web_reg_save_para中保存的参数内容,打印的操作就需要放到请求的函数之后了。 2)web_find和web_reg_find的区别:前面的是查找页面显示的数据,因此需要放在请求页面的函数之后,而且查找的信息是显示的web页面上的信息。后者是注册型函数,需要放到请求的页面之前,而且查找的内容是服务器返回的缓冲数据中查找,所以查找内容应该看html源代码的内容。 基于HTML录制方式的代码,可以使用web_image_check对HTML页面中包含的图片进行验证。并且需要注意的是只有在Runtime Settings > Internet Protocol Preferences选择了"Enable Image and text check"检查点才有效。 |
LoadRunner脚本实例来验证参数化的取值
2009年09月26日 星期六上午 09:54
问题提出: 主要想试验下,在Controller中,多个用户,多次迭代中参数的取值. 方法: 脚本: 我把取到的参数值和对应的VuserID记录下来保存到一个文件中,下面是例子的脚本 long fileopen; char *filename = "C:\\temp\\params.log"; vuser_init() { if ((fileopen = fopen(filename,"a+")) == NULL) { lr_error_message ("file isn't open,path=%s",filename); return 0; Action() { char *vuser_group; //typedef long time_t; //time_t t; long t; char *a = "{aaa}"; char *b = "{bbb}"; lr_whoami(&id, &vuser_group, &scid); fprintf(fileopen,"%d,%s,%s,%s",id,lr__string (a),lr__string (b),ctime(&t)); return 0; vuser_end() return 0; } 参数设置为: 取唯一值,每次迭代更新。 运行时设置的迭代次数为2。 场景的设置: 虚拟用户数:5个 运行模式:没有设置duration,选择的“Run until complete” 完成后的日志文件params.log的内容如下: 1,a1,b1,Thu Jan 01 08:00:05 1970 从生成的日志文件中可以看到VuserID分别为1,2,10,21,30 第一次迭代取参数分别为1,3,5,7,9 第二次迭代取参数分别为2,4,6,8,10 那试验的结果就是每个Vuser取参数的时候相同的Vuser在多个迭代中取的是连续的。不同的Vuser第一个的取值是计算了迭代次数后的那个顺序上的值。 |
使用Sql生成测试数据
2009年09月26日 星期六上午 10:02
|
LoadRunner函数中文翻译系列之二--Check(1)
2009年09月26日 星期六上午 10:03
web_find 参数: 2、Attributes and Specifications list: 支持的属性有: Frame:在多Frame的情况下,定义要查找Frame的范围。 Expect:定义在什么情况下函数检查成功:找到了指定的搜索标准或者没有找到。例如说,可以检查指定的错误信息是否出现在web页面中。合法的值有2个:found和notfound。默认值是“found”。 Matchcase:指定搜索是否区分大小写。 Repeat:指定当第一次发现要查找的字符串时,搜索是否继续。当一个web页面中包含多个被查找的字符串时,此参数是非常有用的。合法的值有2个:yes,no。默认值是“yes”。 Report:指定在什么情况下,VuGen在执行日志中显示此函数的检查结果。合法的值有:success,failure,always。默认值是“always”。 Onfailure:此参数决定在函数检查失败后,Vuser是否中断。参数值是abort。如果指定了Onfailure=abort,当函数检查失败时,不论在运行时设置中的error-handling是什么,脚本都会中断。 如果没有指定Onfailure=abort,那么运行时设置中error-handling将会起作用。 支持的特性有:RightOf, LeftOf (不支持7.x及更高版本)。 RightOf:要查找的字符串右边的内容。 LeftOf:要查找的字符串左边的内容。 3、Searchstring:需要查找的字符串,格式为“What=stringxyz”。此搜索不区分大小写。 4、LAST:属性列表结束符。 返回值 说明 此函数只能在基于HTML录制的脚本中使用。当指定的HTML请求全部完成以后,开始执行搜索过程,比web_reg_find要慢。 web_find函数在C语言的脚本中已经被web_reg_find所替代,web_reg_find运行速度比较快,而且在HTML-based和URL-based的录制方式中都可以使用。 在C语言脚本中,web_find是向后兼容的。Java和Visual Basic脚本中不再支持它。 运行在HTTP模式下的WAP用户都和运行在WSP回放模式下的WAP用户都不支持此函数。 web_global_verification 参数: 1、Text:此属性是一个非空的,以NULL结尾的字符串,表示要查找的内容。语法是”Text=string”。还可以使用text flags自定义字符串。 2、TextPfx:没有指定Text的情况下使用此属性。要查找的字符串的前缀。语法是” TextPfx =string”。还可以使用text flags自定义字符串。 3、TextSfx:没有指定Text的情况下使用此属性。要查找的字符串的后缀。语法是” TextSfx =string”。还可以使用text flags自定义字符串。 4、Search:可选项,在哪里查找字符串。可选的值是:Headers,Body,NORESOURCE或All。默认值是NORESOURCE。语法是“Search=value”。 5、Fail:当字符串找不到时的处理选项:Found (默认值)或NotFound。Found表示当找到对应的字符串时发生了错误(例如“Error”)。NotFound表示当找不到字符串时发生了错误。语法是“Fail=value“。 6、ID:在日志文件中标识当前函数。 LAST:属性列表结束符。 注:text flags:/IC表示忽略大小写;/BIN表示指定的是二进制数据。 返回值 说明 在检测一些应用程序级别(不通过http状态码来表现)的错误时,web_global_verification是非常有用的。如果要定位通过HTTP状态码表现的错误时,使用web_get_int_property。 查找范围:all:这个HTML页面;Headers:页面的头;body:页面的体,包含所有的资源但不包含头;NORESOURCE(默认选项):仅仅包含页面的体,把包括头和资源。 如果不知道要查找的精确的文本,或者要查找的多个文本不是完全相同的,可以使用前缀和后缀来表示。这时需要用到TextPfx和TextSfx属性。这2个属性必须同时指定,一旦指定了其中一个,就不能指定Text属性了。 注意:web_global_verification在WAP协议下不能运行。 web_image_check 参数: 2、List of Attributes: 支持的属性有:Frame(在多Frame的情况下,定义要查找Frame的范围)。 支持的选项有:expect, matchcase, repeat, report, onfailure。 Tip:选项跟属性的区别,大部分选项都只允许设置预定义的值,其他的值都是无效的。 3、Alt:检查图象的ALT标记。不允许空值。 4、Src:检查图象的SRC标记。不允许空值。 5、LAST:参数列表结束的指示符。 返回值 说明 Alt或者Src两者必须有一个在参数列表中出现。如果两项都通过,那么检查成功。 此函数仅仅支持基于HTML的脚本。 |
LoadRunner函数中文翻译系列之三--Concurrent Group
2009年09月26日 星期六上午 10:04
|
LoadRunner之协议选择
2009年09月26日 星期六上午 10:08
在学习LoadRunner协议选择之前,我觉得我们有必要了解一下协议的基本概念。首先我们知道,计算机与计算机之间的通信都离不开通信协议,接着我们来说说通信协议的概念。通信协议是什么,通信协议实际上是一组规定和约定的集合。说白了就是两台或者多台计算机在通信时必须约定好本次通信做什么,例如是进行文件传输,还是发送电子邮件;然后约定怎样通信,什么时间通信等。因此,通信双方要遵从相互可以接受的协议(相同或兼容的协议)才能进行通信,如目前因特网上广泛使用的TCP/IP协议等,任何计算机连入网络后只要运行TCP/IP协议,就可访问因特网。 了解了协议的基本概念和作用之后,我们来说说LoadRunner的协议选择。LoadRunner首先是一个测试工具,其次是一个性能测试工具,然后是该工具是一个基于协议,也就是说LoadRunner测试的对象都需要使用通信协议,对于那些不使用通信协议仅仅进行本地处理的软件例如Microsoft Word,LoadRunner就不适用。 说到通信协议我们来熟悉一下协议的分层,按照OSI的分层模型,分层结构如下: OSI七层模型 按照TCP/IP协议的分层,分层结构如下: TCP/IP协议 第一个分层是由OSI制定但不实用,后一个是目前广泛使用且被业界认做既定标准的协议分层,下文探讨的LoadRunner协议选择即按TCP/IP协议的分层模型讨论。 接着来说说LoadRunnerVuGen中的协议分类,VuGen(LR8.1)中的协议分类如下表所示: 应用程序部署解决方案 仔细研究发现LoadRunner VuGen中的协议与文章开头所说的通信协议还是有一定的区别的,例如像LoadRunner VuGen中的C 模板、Visual Basic 模板、Java 模板、Javascript 和 VBScript 类型的脚本均为开发语言,非通信协议,但LoadRunner即把它列在这儿,我们也就暂且认可。 了解了LoadRunner的协议类型之后,我们进入正式话题,即测试时如何选择协议。 正式测试之前,测试人员都需要预先熟悉被测对象,我们需要知道我们的被测对象是一个什么样的结构,是B/S结构还是C/S结构,了解这个之后,我们还需要了解被测对象所使用的协议是什么,也许有的人说我们的程序使用的是TCP/IP协议,其实他的回答跟我们需要知道的差别很大,因为我们知道,所有的通信软件都需要使用TCP/IP协议,为什么呢,因为这个协议是底层协议,所有应用层数据都必须经过这个协议封装之后才能向更底一层传输。我们需要知道的是被测对象在应用层使用的是什么协议,就像我们使用邮件客户端发送邮件一样,我们知道使用的应用层协议是SMTP,使用邮件客户端接收邮件时使用的时POP3协议。了解上述信息之后,我们的定位也就准确了,也就是说在LoadRunner中所说的协议基本上都是应用层协议(也有底层协议,例如 Windows Sockets),知道这点之后,我们在询问开发人员时就避免了不少麻烦,省的开发人员告诉你我们使用的是TCP/IP协议或者其他底层协议。 了解了LoadRunner中的协议之后,我们就进入协议确定阶段,协议的确定,通常有如下几种方法: 1、通过询问开发人员获知所使用的协议,通常这是最简单也是最直接的方法;因为没有人比开发人员更清楚他们所开发的应用程序使用的什么通信协议了; 2、通过概要或详细设计手册获知所使用的协议,在没有开发人员支持的情况,通过概要设计或详细设计获知所使用的协议不失为第二简便方法; 3、通过协议分析工具捕包分析,然后确定被测对象所使用的协议。在使用协议分析工具分析协议过程当中一定要摒除底层协议,不要被底层协议所迷惑; 4、通过以往测试经验确定被测对象所使用的协议,当然通过这种方法确定的协议有一定的不准确性; 通过以上四种方法我们基本就确定了录制时应该选择什么协议,光确定协议是没有用的,最主要的是付诸行动,确定了协议之后,我们进入VuGen开始录制脚本,录制完成后看看是否生成相应脚本,如果脚本内容为空可能我们选择的协议不正确,我们可以尝试选择其他协议。 一般来说协议选择有如下原则: B/S结构,选择WEB(Http/Html)协议; C/S结构,可以根据后端数据库的类型来选择,如SybaseCTLib协议用于测试后台的数据库为Sybase的应用;MS SQL Server协议用与测试后台数据库为SQL Server的应用;对于一些没有数据库的Windows应用,可选用Windows Sockets底层协议;使用了数据库但使用的是ODBC连接的数据则选择ODBC协议; 对于有些使用纯JAVA编写的C/S结构的东东,采用JAVA,而且不能录制只能手工编写代码(工作量和难度还是有的)。同样不能录制的还包括C、VB Script、VB、VBNet User协议。 对于Windows Sockets协议来说,最适合的那些基于Socket开发的应用程序;但是由于网络通讯的底层都是基于Socket的,因此几乎所有的应用程序都能够通过Socket来录制,哪可能有人会问,哪既然Socket都能录制下来,还要那么多协议做什么,价格还贼贵,其实最主要的原因就是Socket录制的代码可读性较差,如果Socket的脚本可读性较高的话,实话就没有其他协议出现的必要性了。 对于邮件来说,首先要看你收邮件的途径,如果你通过WEB页面收发邮件,毫无疑问,你选择协议时就需要选择HTTP协议,如果你通过邮件客户端,像OutLook、FoxMail之类的,则需要根据操作不同选择不同的协议了,例如发邮件你可能要选择SMTP、收邮件你可能需要选择POP3。 |
LR中常用的C函数
2009年09月26日 星期六上午 10:09
LR中常用的C函数
|
LR字符串与参数的操作及转换技巧
2009年09月27日 星期日下午 03:01
刚开始学LR时,经常搞不清楚变量和参数的区别与用法,最近在一次脚本编写中,整理出来的一些小技巧,与大家一起分享。 //字符串复制 //字符串连接 //变量转为参数,将变量str的值存到参数Param中 //参数复制 //参数转为变量 //参数名称格式化输出到变量中 运行结果: | ||||
查看文章 | ||||
AS3及Flex的百条常用知识
2009年10月10日 星期六下午 03:07
【改变输出swf的尺度,背景颜色或帧频】 【鼠标坐标】 【检查变量类型并返回布尔值】 【检查变量类型并返回类型】 【检查对象类型并返回该对象】 【是数字但不是有效数字问题】 【取消默认的严格编译模式】 【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】 【复杂数据类型类似按引用传递】 【优化逻辑AND(&&)和OR(||)的小知识】 【Timer类注意事项】 【private,protected,internal,public访问权限】 【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】 【错误处理try,catch,finally】 【for...in与for each...in的区别】 【命名包路径的小技巧】 【隐式的取出方法(getter)和设定方法(setter)】 【确保类是绝不会有子类,使用final】 【super关键字的使用】 【建立常数,使用关键字const而不是var】 【检测播放器版本】 【判断客户端系统】 【检测播放器类型】 【检测系统语言】 【判断用户是否启用了IME(输入法编辑器)】 【检测屏幕的分辨率】 【把弹出窗口居中的算法】 【控制影片配合Player的方式,包括缩放问题】 【舞台的对齐方式】 【隐藏Flash Player的右键菜单】 【检测系统是否具有音频功能】 【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】 【检测播放器能 (true) 还是不能 (false) 播放流式视频】 【检测播放器是在支持 (true) 嵌入视频的系统上运行,还是在不支持 (false) 嵌入视频的系统上运行】 【检测播放器能 (true) 还是不能 (false) 对视频流(如来自 Web 摄像头的视频流)进行编码】 【显示 Flash Player 中的"安全设置"面板】 【让其它域的.swf访问本域的.swf】 【数字的不同进制之间的转换】 【使用Math.round()对一个数取整,四舍五入】 【使用Math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】 【使用Math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】 【产生一个随机数】 【把数字取至最近的小数点位,即指定精确度】 【把数字取成一个整数的最接近倍数值】 【在指定数值范围内获得随机数】 【弧度(radian)与度数(degree)之间的转换】 【计算两点之间的距离】 【模拟圆周运动】 【模拟椭圆运动】 【华氏温度和摄氏温度之间的转换】 【公斤与磅之间的转换】 【向数组尾端添加元素】 【向数组开端添加元素】 【删除数组中第一个元素并返回该元素,使用shift()方法】 【删除数组中最后一个元素并返回该元素的值,使用pop()方法】 【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】 【查找数组中第一个相匹配的元素】 【查找数组中最后一个相匹配的元素】 【把字符串转成数组】 【把数组转成字符串】 【使用对象数组处理相关数据】 【在数组中获取最小或最大值】 【使用for ... in语句读取关联数组元素】 【AVM(ActionScript Virtual Machine,虚拟机)和渲染引擎(Rendering Engine)】 【指出容器的显示清单中有多少显示对象】 【把项目新增至显示清单】 【从显示清单中移除项目】 【更改现有子项在显示对象容器中的位置】 【关于TextField以垂直方式把文字摆在按钮表面中心点的小技巧】 【外部.swf影片载入和互动】 【TextField有两种类型:动态(dynamic)和输入(input),默认值为动态.改变TextField类型方法】 【过滤文字输入】 【设定输入框的最大长度】 【向TextField追加内容】 【显示HTML格式的文字】 【缩减空白】 【自动大小调整和对齐】 【指示文本字段是否自动换行】 【用程序手段滚动文字】 【响应滚动事件】 【样式化文字的方法】 【对用户输入的文字进行样式化】 【对现有文字的一部分进行样式化】 【设定文字框的字体】 【嵌入字体】 【建立可以旋转的文字】 【显示Unicode文字】 【把Flash Player的焦点带给文字框】 【以ActionScript选取文字】 【在文字内设定安插点(游标位置)并访问游标位置的索引值】 【当文本字段受到选取或取消选取时给予响应】 |
查看文章 |
人人renrenAPI开发简易指南
2009年11月04日 星期三下午 01:48
是时候研究一下国内的开放式API了,所以抽时间搞了一下,先从校内下手吧,相对来讲他的资料算是最多的了。但是即使如此,想从零开始写一个应用出来,还真是花了我不少功夫。资料实在是太难找了。校内的API从6、7月份就出来了,还弄了个专门的Wiki作为开放平台的门户,但是里面的资料出奇的少,除了对几个api函数的说明,对xnml的简单说明,其它的几乎为0。所谓的一个上手指南只讲了怎么注册用户和怎么注册程序,注册完以后的开放过程却一点也没提。想根据这份东西写个真正的应用出来,简直是不可能的任务。没办法,上Google,上社区,上应用的论坛,一篇篇帖子里找线索,最后总算是把一个应用给凑出来了。 如此糟糕的技术支持能力,直接决定了校内API应用的未来。 开发过程简介: 首先需要注册成校内用户,然后在自己的菜单上有个应用,添加一个“开发者”应用,这里面包括一个社区,一些开发所需要的链接。进入这个应用以后,可以看到一个申请开发许可证的按钮,点击就进入设置应用属性的环节,起名字,定URL之类的。(这一步在校内的Wiki上是有说明的。)有个安装到校内的选项,默认是否,结果选了以后我的应用就变成了外部应用,在校内只提供一个链接进入而已,这当然不行了。当我把应用删了重新添加的时候,原来使用的那个URL被占用了,无耐,换了个更难看的URL。应用还有一个重要的属性,就是运行状态,是以iframe形式还是xnml形式,这个待会再讲。第一次建议先选iframe形式,这个是随时可以修改的。 这些东西都设置完,应用就生成了。你会得到一个api_key,一个secret key,不过这两个东西都没什么用。 校内应用的工作原理: 如果是xnml方式的应用,用户访问apps.xiaonei.com/xxxxx/yyyyy这样一个地址的时候,xxxxx代表你申请一个应用的时候自己定义的那个URL,校内的API服务器会在后台将用户对该页面的请求(包括所有参数)转发给你的应用,也就是你申请应用的时候填的那个自己的应用地址。如果你的应用在你的服务器上是www.aaa.com/xxxxx/这样一个目录,那么上面这个请求就会被转发到www.aaa.com/xxxxx/yyyyy这里,不管yyyyy是个html页面还是个目录形式。转发的同时,还会多几个参数过来,包括当前用户的id,当前用户的sessionid,还有你的api key。你后续的所有的页面的链接,都要写成以apps.xiaonei.com开头的地址,由它来转发请求。 如果是iframe的应用就简单多了,海内直接生成一个iframe,把你注册时填的那个起始地址放进去,同时包括前面说的几个相同的参数。剩下的事情他们就不管了。 因为每次请求都是校内的服务器发给你,所以你的服务器上写Cookie或者session之类的东西是没有用的,必须每次取得这几个参数来决定当前用户是哪一个。(校内在这里有一个极其严重的设计失误,那就是没有用到创建程序时生成的那个secret key。校内发过来的这三个参数只能帮你确定是哪一个userid发过来的请求,而这三个参数之间是没有什么关联性的,比如你无法根据sessionid来判断这个userid是否合法。而在iframe状态的应用里,这三个参数直接暴露在浏览器代码里,用户只要复制下来,把userid改成另外一个数字放到浏览器地址栏里就OK了。现在,如果你想确保访问用户的合法性,就必须要通过校内的API调用,到他的服务器上去,把这三个参数发过去,看它的返回结果,多一次网络调用所带来的时间损失,远远大于任何的数据库运算或者数字运算。实际上,校内只要加上第四个参数,也就是你的secret key和其中任何一个参数合并后的md5码,你在取值以后用同样的算法生成md5码,比较一下跟传过来的值是否相等就OK了,完全不需要为了验证用户合法性而增加一次网络调用。更可恶的是,每个页面你都要做一次这样的网络调用。当然,你也可以在验证合法以后用自己的服务器保存一下userid和sessionid的对应关系,下次请求如果仍然是这两个数值就不用再网络验证了,但是这又增加了无谓的数据库调用。) 你已经拿到了用户在校内上的用户ID,并且确认他已经成功登录校内,接下来就是处理你自己的业务逻辑。比如在你的数据库里新增加一个用户,并绑定到这个校内ID上,然后对该用户进行某些操作。最后就是返回页面内容。 这里就到了iframe和xnml模式的区别。如果是iframe模式,你返回的页面内容直接显示在iframe里,那自由度就大多了,跟普通的网页一样,想怎么做就怎么做。不过要小心iframe跨域的js问题。 如果是xnml模式,你返回的内容(还是普通的html,但是没有body标签了)是由校内的api服务器接收到的,他们对内容进行解析,然后显示在自己的层里,展现给用户。为了防止一些非法操作,xnml规定了哪些html语法是合法的,如果出现不合法的语法,会直接报错。(这里又缺少一个可用的debug方式,一旦在这个步骤出现页面错误,极难调试。)Wiki的文档里写了这里是不允许出现自己的css语法的,但是实际上现在又是可以用css的,至少style和class两个关键字都是允许的。除了普通的html语法,xnml还定义了一些他自己的语法,通过这些语法,你可以在页面上直接显示出用户的姓名头像链接好友等等信息,而无需在你的程序里通过API调用去获取。 如果你要使用form来post数据,把form的action定义成相对路径,相对于你的这个应用的实际路径,比如,如果你的原始action应该是www.aaa.com/xxxxx/save.jsp,那么只要写action=’save.jsp’就可以了,在显示出来的时候,校内会将它替换成他们自己的相对路径,然后转发到正确的地址。 最后说说最有技术味道的东西,对校内API的调用。 现在校内一共只公开了为数不多的几个API,可以获取用户信息,好友信息,给用户发通知,现在还可以增加用户的新鲜事。对这些API的用户方式都是通过Post来实现的,Post的地址是固定的,就是这个地址:http://api.xiaonei.com/restserver.do,你需要对这个地址进行Post,发送几个参数过去,包括api_key,session_key,也就是校内传过来的那两个值,还有method,就是你要调用的方法名,然后不同的方法需要使用不同的参数,这些就可以去看校内的API文档了。这些参数Post过去以后,校内会返回一个xml,(虽然所有的调用都有个response格式的参数,可以选择xml还是json,但是,即使你选了json,它还是返回xml。)xml里要么包含错误码,要么,包含了你需要得到的信息,自己解析一下就行了。 所有的调用过程,包括你返回的参数和传递的参数,还有校内给你的参数,全部是utf8格式的,包括你生成的html。 这里只是一个开发过程的简单描述,不涉及代码,有兴趣的可以去看看校内自己的示例代码,是java的。有必要的话我也可以用代码的方式来写个demo,看大家的需要了。(论坛上面的hello world的demo对于实际开发的帮助几乎为0)。 本文来自:http://www.unfish.net/archives/331-20080910.html 下面是有关校内开放平台的介绍 校内网大家都知道吧,最近校内网推出了应用程序开发接口供校内网用户来开发应用程序扩展,今天我们来介绍下校内网开发的标识语言XNML,利用它我们就可以为校内网开发自己想要的应用程序了。 什么是XNML XNML是校内网为校内网用户提供的一种标识语言,使用它我们可以调用校内网的指定数据,利用这些数据可以开发我们需要的应用程序。 XNML编写程序的原理是什么我们先分析一下从一个用户发出浏览网页请求到呈现网页内容的这个过程: 1、校内网用户访问你用XNML写的网页,此时会对校内网的服务器发送请求。 2、校内网的应用程序(app)服务器接收用户请求,并根据该应用程序的相关配置找到编程者存放应用程序的另一台服务器(我们的XNML代码就放在这台服务器上) 3、读取编程者编写的网页程序,把其中的XNML标签翻译转换成相应的表现形式(这个过程不需要我们了解,校内网也不会公开) 4、转换过后,结果就会呈现在刚才发出请求的用户面前。我们所写的代码被校内网的服务器读取并翻译,最后呈现出来。翻译的内容就是我们在程序中所用到的XNML。XNML就充当着这样的角色:临时变量。 该怎么看待XNML 谈谈个人的理解,XNML就像校内网提供的一个中间接口,我们不用直接访问校内网的数据库,直接利用这个接口,就可以得到我们需要的数据。比如我们需要得到ID为12345这个校内网用户的姓名和这个用户所在的网络,怎么得到呢,我们只需要在自己的网页程序(HTML形式)中,写入 就可以了,上面的这个XNML片段在校内网中被调用的时候就会自动被校内网服务器解释成如下字符串: 张三(XXXX大学) 这个用户的姓名及所在网络的字符串,也就是说,在显示的时候,他会以该编号用户的姓名和所在网络替换咱们写的这句代码。 简单的XNML例子(Hello,World) ASP PHP echo 'Hello,'; ?> ASP.Net Response.Write("Hello,"); 比如我在校内网的名字叫张三,当我访问这个网页是,就会显示 Hello,张三 上面的例子很简单,但是很能说明问题,具体的细节问题大家请访问http://dev.xiaonei.com来看,把XNML嵌入到你的动态网页中,就可以制作出你想要的应用程序了。数据放在那,关键就看你怎么用了。 从头开始,我们来做一个校内网应用程序 如果你从来没有接触过校内网应用程序这个概念,那就太落伍了(开玩笑哈),没关系,现在从头开始! 1、我们先要安装一个“开发者”应用,这是我们通向自己开发的毕竟之路(要是我的应用程序有这个待遇就好了,hoho),安装地址:http://app.xiaonei.com/developers/home.do(当然得先登录校内网,再访问喽) 2、安装完毕后,你会在左侧的列表中看到可爱的它,点击它。在右上角你会看到“申请开发许可证”按钮,点击进入。 3、这时就改配置你的应用程序了(什么?没想好做什么,那就呆一边想吧),下面只说明几点比较重要的。 Callback URL:你编写的网页程序存放的URL路径,比如(http://www.dzstu.com/xxxx),我们的网页程序全都放在你的服务器上的这个xxxx路径里 Canvas Page URL:后面的文本框给你的应用起个英文名字填里面(必须超过6字符),假设我们这里填写dzstudotcom,下面选择"使用XNML" 应用的服务器IP地址:填写你的网页程序存放的服务器的IP地址,不知道?ping下先,什么?ping不通,问客服!无奈中.... 安装后跳转地址:http://apps.xiaonei.com/dzstudotcom/index.php (一般应该是你程序的首页,不过你要是比较另类那就随便了,但前面必须是那个形式哦) 默认XNML:这个是显示在安装了这个应用程序的个人主页里的,有需要的话可以写写。 左侧导航地址:写上你应用程序的首页吧,比如这里的http://apps.xiaonei.com/dzstudotcom/index.php ,到时候会以这个地址出现在左侧的导航菜单里,然后保存。 4、写你的程序吧,还呆着想啥 5、填写应用程序说明,补充图片封面什么的,然后拿你的Canvas Page URL发给别人安装吧,安装5个人就可以提交审核了,审核通过的话,那么恭喜你,你的服务器要经受考验了。 |
查看文章 |
Manyou API开发感受
2009年11月04日 星期三 下午 02:03
做完了校内的API版本以后,本想做海内和开心网的,找半天没有一点关于API的消息,似乎从来没有公布过一样。但是里面的那些应用又不像全部是公司开发的,难道属于内测阶段? 于是转去研究UCenter的API-Manyou。初看起来,Manyou的API完成度更高,文档也更细,而且已经有了MYQL和MYJS,比校内的更加成熟。结果,真正开发起来,才发现简直是场恶梦。 注册新程序的流程跟校内一样,但是少一个映射URL的选项,也就是说你的程序没有短路径。 API的函数和参数的说明都不少,但是偏偏没有如何调用。(有,但是是PHP版的,而且是PHP开发包的调用方法,如果你想自己做Post请求,Sorry,即找不到服务器地址,也找不到接收到的参数的说明。) Python已经有了一个开发包,结果装上以后却说有一个函数未定义,启动不起来。 尝试了N多种方法,都没有办法成功的发送一个Post。 然后放弃了这种方法,只接收用户ID,不打算进行验证了。界面终于显示出来了。又发现其它页面的相对链接都不对了。又是一阵调试加猜测,总算找对了方法,把链接都改成相对于你的目录的链接,但是又不是相对链接,而是写绝对链接。 最后,看起来所有的页面都显示正确了,但是一个Form的Post又遇到了困难。我没办法让这个Form往正确的地址Post。换了多种方法,始终提示Bad Request。而且,Form里面被插入的隐藏变量居然跟Get的时候不一样,没有my_sig_uid字段…… 算了,放弃了。浪费我一天的时间。 This entry was posted on 星期一, 九月 15th, 2008 at 15:56 and is filed under 技术文章. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. 5 comments so farfreeman 从您的反馈来看我们的文档确实要完善的还很多。呵呵,还是很希望您能加入到我们的开发者行列来的 :) my的平台和别的有些不同的地方,几个问题我说明一下: 1. 路径的问题,为了和站长共赢 应用的pv是要和站点共享的,所以要显示成站点的,短路径也就没有什么用了。 九月 16th, 2008 at 00:54 非鱼 对于第四条,这几十个应用,似乎全部都是Post到当前页面的,我找不到办法Post到另外一个页面上去。 九月 16th, 2008 at 09:00 非鱼 Manyou的审核过程居然会对程序的功能提出意见,要求我加上某个功能……这似乎有点过分了。 九月 23rd, 2008 at 09:31 匿名 Form里面被插入的隐藏变量居然跟Get的时候不一样 你读下COOKIES看。全在里面。所有的POST过来的数据由MANYOU.PHP生成COOKIES 要说明一下,POST是MYML用的,GET是IFREAM用的。 十二月 5th, 2008 at 21:29 非鱼 不要使用$_GET或者$_POST,直接使用$_REQUEST就行了。 |
查看文章 |
校内/Manyou/Alisoft API应用开发Demo
2009年11月04日 星期三下午 02:04
其实要写个完整的Demo是挺困难的,而且目前我只做了Python的开发,没有写过其它版本,而且以我的习惯,我也不喜欢写完整的代码给别人去抄,所谓授之以鱼不如授之以渔。写个自然语言的版本吧,写起来简单,看的人也容易使用自己喜欢的语言来搞定。 为什么把三个放在一起呢,其实它们的API区别不大,流程都是一样的,只是参数名字的区别而已。 API的工作流程如下:(这些东西三个网站的开发手册里都有) 用户登录到校内/Manyou/Alisoft以后,进入他的应用列表,可以看到他安装过的所有的应用,点击某个应用的时候,就会跳到一个特定的地址。校内和Manyou有XNML/MYML的开发方式,在这种方式下,用户的每次点击都是点到他们的地址上,在他们的服务器上把请求转发到你的网址。这种情况下你在自己的网站上是不能用Session或者Cookie来记住用户的,因为所有的用户都是同一个地方发来的请求。所以你只能每个页面都要从他们传过来的参数里获取当前用户的信息。而IFrame的方式要简单的多,只要给他们一个入口,他们就会生成一个IFrame把参数传入你这个入口地址,以后用户的所有操作都是在你的网站上,所以只要这个入口页面处理查询用户信息并用你自己的Cookie来登录,剩下的跟其它的页面逻辑是一样的。Alisoft也是这样做的。所以这里我只讲IFrame方式。 校内和Manyou是跳到它自己域名的一个URL,然后生成一个IFrame链接到你网站的一个地址,Alisoft则是直接跳到你的网站上的地址。跳到这个地址的时候会带一些参数过来,比如当前用户的ID,SessionID,还有其它一些参数,但是真正有用的就是这两个。凭这两个参数,你就可以反过来去查询该用户的所有信息。 所以你首先需要一个处理登录的页面,接收他传过来的参数,在参数里获取用户ID,SessionID,然后查询用户的真实身份和用户名,如果验证是从API应用里点过来的,就在你自己的站上查询这个用户ID是否已存在,如果存在就取出来设他的Cookie或Session让他登录,如果不存在,就生成一个新用户,跟这个用户ID绑定起来,然后让他登录就行了。用户再点你其它的链接,就是你网站的一般逻辑而已了。 各种语言都有自己发POST请求的方式,需要自己去看看帮助了。 查询用户信息的方式: 校内的:只需要在REQUEST里获取这两个参数:xn_sig_user,xn_sig_session_key,然后往这个地址http://api.xiaonei.com/restserver.do Post这些参数: api_key:你的应用的Key,官方给出来的那个串,method:’xiaonei.users.getInfo’,session_key:就是前面获取的这个,call_id:0,sig:空字符串,v: ‘1.0’,fields:’name,sex’,uids:前面获取的那个user。 单引号括起来的就是固定字符串。至于sig,本来它应该是个用来验证请求身份是否合法的加密串,但是校内现在并没有用到,所以传个空的过去就行。如果用户是合法的,你就会得到一个包含<name>和<sex>的XML文本,剩下的应该是你自己的问题啦。 Manyou的:你需要获取三个参数:my_sig_uId,my_sig_sessionId,my_sig_prefix,前两个跟校内一样,最后一个是该用户实际所在站点的URL(因为Manyou是一个应用服务器给所有的UCenter子站服务的)。当然还有个参数my_sig_key可以用来验证传过来的参数是否合法,如果你只需要获取用户ID,不需要知道他的名字,就用这个参数来验证的话就可以省却一次POST的时间了。 然后需要需要往这个地址http://api.manyou.com/openapi.php POST这些参数: api_key:你的应用的key,官方给的,format:’JSON’,(否则默认返回PHP格式的),method:’user.getinfo’,session_key:前面获取的sessionId,v:’0.1′,args[fields]: ‘name,sex’,args[uids]:前面获取的uId,sig:加密字符串。 重点在这个加密字符串的计算上,它的算法是把通用参数按字母排序,再加上你所调用的这个API方法的专用参数,再加上你的应用的安全码(申请的时候给的),拼成一个字符串算出来的MD5。比如上面这个方法,拼字符串就是: ‘api_key=’+apikey+’&format=JSON&method=user.getinfo&session_key=’+my_sig_sessionId+’&v=0.1&args[fields]=name,sex&args[uids]=’+userid+’&’+code 注意我中间引号外面的是自己的变量名,别照抄。最后的code就是你的安全码。对这个字符串算一个MD5就是前面需要POST的那个sig参数的值了。 这样如果请求合法,你会得到一个JSON格式的返回,格式为"name":"用户名","sex":"性别"。你只要分解字符串就可以拿到这个用户名了。剩下的就是自己的问题了。 Alisoft的:跟Manyou的非常相似 你需要获取三个参数:user_id,app_instance_id(就是sessionID),token(有特殊用途)。 然后往这个地址http://sipdev.alisoft.com/sip/rest (正式上线后把域名里的dev去掉)POST以下参数: appId:你的应用的编号(官方给出的),appInstanceId:前面给出的,sip_apiname : ‘alisoft.validateUser’,sip_appkey:跟appId一样,sip_timestamp:当前时间字符串,格式为2008-10-01 08:00:00,token:前面获取的那个,userId:前面获取的那个,sip_sign:加密字符串。 加密字符串的计算方法跟Manyou类似,但是串联字符串的时候没有&和=,而是把所有的内容串在一起,而且你的安全码是放在字符串的最前面的,前面这个方法的字符串就是: code+’appId’+appid+’appInstanceId’+instance+’sip_apinamealisoft.validateUser’+’sip_appkey’+appid+’sip_timestamp’+now +’token’+token+’userId’+userid code是你的安全码,now就是前面说的时间字符串,其它的变量一看就知道了。 返回的内容只有一个<String>1</String>,包含这个就说明该用户是合法的,但是并不会返回他的用户名,如果你想获取用户名的话,还得再去调用另外一个API,自己去看看官方的文档吧(因为他的用户可能是淘宝的,也可能是阿里巴巴的)。调用方法是一样的。 |
查看文章 |
校内api教程
2009年11月04日 星期三下午 03:15
> 前言 |
查看文章 |
AS3动态获得类名及类的方法
2009年12月01日 星期二下午 05:33
1.获得某个实例对象的类名:getQualifiedClassName (实例名字符串表达式); |
查看文章 |
AS3教程:写AS3十个注意
2009年12月01日 星期二下午 05:33
AS3教程:写AS3十个注意 总结起来需要注意的原则就是:尽量在编译的阶段发现错误,因为这时发现并解决错误远远要比在运行时出错解决起来容易的多。可是实际情况中很多人经常会违反这一原则,下面是我列举的10个技巧: (1) 永远不要使用'Object' 来存储数据. 因为这是一种绕开编译器检查的做法,完全不符合面向对象的思想。如果要用Hashmap或者相应的数组,那么可以用Dictionary。否则,请自已定义一个类,而不要使用Object来作为数据的存储器。 (2) 不要用Object来作为对象的类型。这是欺骗编译器的方法。如果必须这样用,最好在存取属性或者调用函数时,先进行强制性的类型转换,至少这是给编译器的一个提示,也帮助其他人理解你的代码。 (3) 也不要用*类型。 4) 不要将ActionScript的类声明为动态。 (5) 注意Application.application (和其他的无类型的框架属性). 这个属性有一些古怪,他应该是Applicaton类型的,因为他指向的实例必须是Application的子类. 但实际上他的类型是'Object', 无法应用编译时的检查。如果你一定要用,最好也进行类型的强制性转换。: MyApplication( Application.application ).functionCall(); (6) 封装你的Xml。使用Xml与Server进行数据的交互非常方便,但是尽量避免使用Xml作为核心数据模型。从服务器收到数据后,尽量把Xml转换为强类型的对象模型。在Flex应用内部使用Xml是绕开编译器的作法。 (7) 不要使用DynamicEvent. (8) 不要使用mx:Model。如上所述,请尽量使用自定义的强类型的类. (9) 不要使用Cairngorm中的data属性,而应该继承扩展CairngormEvent来传递数据。 (10) 不要把编译器的严格模式关掉 |
查看文章 |
as3中字符串的处理
2009年12月23日 星期三下午 02:05
as3中字符串的处理
|
---------------------------------------------------------------
作者:whylaughing
博客地址:http://www.cnblogs.com/whylaughing/
注意事项:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。