Synergy 一套键鼠同时控制多台电脑的神器!

想必很多人都拥有多台电脑,譬如台式机+笔记本,很多时候我们都会同时打开它们工作。可是你有没发现,如果桌子上摆放着多台电脑多套键盘鼠标,不停来回切换使用是否很累呢?如果说现在可以只用一套键鼠,就能同时控制你全部的电脑,你会否兴奋?

Synergy 正是为此而生的好工具!它可以让你的多台电脑共享一套键鼠,甚至还可以共享剪贴板,而你只需动动鼠标,指针就可以轻松地在各台电脑屏幕之间来回穿梭,就像一台电脑使用多个显示器一样。而且 Synergy 完全免费开源,并跨平台支持 Win/Mac/Linux,相当给力! 使用之后,工作效率提高,腿不酸腰不疼,桌面也干净了,绝对是绝世神器啊!

Synergy 的使用方法:

我的桌子上有1个台式机 (Windows7) 和1个 MacBook Pro 笔记本 (Mac OSX),偶尔还会用到另外一台笔记本 (Linux/Win双系统) 同时协同工作,这时候桌子上的键鼠们开始打架了,3个鼠标+2个键盘,还要不断移动身体去迁就电脑的位置。这时候就可以,或者说是非常需要 Synergy 来解放这种痛苦了!OK,开始吧……

Synergy

Synergy 有一个使用前提,就是你的应用环境中的多台电脑需要在同一局域网内。譬如说,家里使用一个路由器共享上网的,其下的全部电脑一般就是在同一局域网内。关于局域网的知识就不再在此阐述了,估计大家都知道怎么组网吧。

虽然 Synergy 的配置和使用其实并不难,但目前它只有英文界面,而且界面我个人感觉做得不是很易用,可能新手咋看上去有点晕,我大概说说它是怎么个运作的吧。当然,这事也不能说得太细,不然大家就没得折腾了,这一没折腾,很多人就没人生乐趣了,到时候黑着脸来找我就不好。

设置服务器端:

为了简单起见,我现在只选用已经在同一局域网下的 Macbook Pro 和 PC 两台电脑,而且为了教程更通用,我把MBP也切换到Win7系统 (就是现在两台电脑都是Win7了),在它们中都安装好 Synergy 之后,那么我们先要挑一台使用键鼠的机器设置为服务器端,这里是我的台式机。如图:

Synergy服务器端

按 Configure Server 进入设置界面:

Synergy设置

从右上角拖动一台电脑放到方框中 (删除的话是把电脑图标拖放到左上角的垃圾桶),模拟现实的位置摆放好。例如我的台式机PC是服务器端,MacBook 是在台式机的左边,按图中那样设置,然后把名字改成客户端电脑的计算机名(Win用户可以在“我的电脑”右键属性中看到)。如果多台电脑也是这样依次添加,确定后返回之前的界面,按Start启动服务。

设置客户端:

客户端的设置比服务器端要简单得多。我们来到 Macbook上,启动 Synergy 后,只要选择成客户端模式,并填上服务器的计算机名或者IP地址即可。如下图,设置好后,同样按 Start 即可让其连接服务器。

Synergy客户端

一般来说,如果连接成功的话,你的鼠标已经可以游走在两台电脑之间了。当然,当的鼠标从PC移动到Macbook之后,我们的键盘也会对Macbook生效,而对PC无效了。我可以在 MacBook 上CTRL+C拷贝一些文字,然后再移动回PC上按键盘CTRL+V粘贴,一切都是那么顺畅自然!非常有意思!

写在后面:

Synergy 真的是一款相当相当赞的软件!它能大大提高多电脑用户的工作效率,特别是频繁要在不同平台下工作的朋友。更难能可贵的是,这么优秀的一款软件竟然还是免费开源的~不得不对作者肃然起敬啊。其实对于这种软件,即使是要付款的,我也觉得很值得,因为它能真真切切地方便自己。目前唯一美中不足的是,它只能跨机共享剪贴板中的文本信息,不能跨电脑拷贝文件,也不能方便地在两台电脑之间随意拖动来传输文件,不然就真是碉堡了。至于在MacLinux下的操作、快捷键的设置等更多高级的玩法就等你自己去折腾吧。

另外,我发现这货还能用来捉弄人,让女友/男友给送个小鼠标,然后偷偷帮ta装上 Synergy 之后连接好,在Ta正沉迷着玩某东西的时候,一鼠标飞过去,咩咔咔,咱家的小鼠标还有魔法效果呢!这种吓死爹的效果真不错的。废话我说完了,撤……

发表在 apple, 实用工具 | 2 条评论

利用Selenium自动化web测试

简介: Selenium 是一个没有正式指导手册的开源项目,这让测试人员的问题调查很费时间。本文为基于 Selenium 1.0(发布于 2009 年 6 月)的测试期间的常见问题提供最佳实践。

简介

Selenium 是一个健壮的工具集合,跨很多平台支持针对基于 web 的应用程序的测试自动化的敏捷开发。它是一个开源的、轻量级的自动化工具,很容易集成到各种项目中,支持多种编程语言,比如 .NET、Perl、Python、Ruby 和 Java? 编程语言。

利用 Selenium 测试 Ajax 应用程序

Asynchronous JavaScript and XML (Ajax) 是一种用于创建交互式 web 应用程序的 web 开发技术。Ajax 应用程序的一个特征是,不会导致一次重新加载整个页面。相反,浏览器将具有一个对服务器的异步调用以获得数据,并且只刷新当前页面的特定部分。要提高 web 页面的交互性、响应速度和可用性,测试 Ajax 应用程序的过程需要一些改变。

我们首先刷新 web 页面,然后就是等待,直到异步调用完成。完成之后,可以继续进行验证。此时,出现适当等待时间的问题。

一种选择是在测试应用程序中简单地暂停一段固定的时间,这在大多数情况下都是可行的。在有些情况下,比如说网络吞吐量很慢时,Ajax 调用在暂停一段特定的时间之后没有完成,会导致测试用例失败。另一方面,如果暂停时间太长,会使得测试慢得不可接受。

Selenium 提供了更为高效的处理等待的方式。一种可能做法是,使用类 com.thoughtworks.selenium.Wait 来等待一个元素或文本在页面上出现或消失。可以在 until() 函数中定义等待的退出条件,或者扩展 Wait 类来实现等待退出。清单 1 是使用 Wait 类的样例代码。它将在条件满足时停止等待,或者在超出最大等待时间时返回一个超时异常。

清单 1. 等待元素或文本出现

Wait wait = new Wait() {

public boolean until() {

return selenium.isElementPresent(locator);

// or selenium.isTextPresent(pattern);

}

};

wait.wait(“”, timeoutInMilliseconds);

另一种选择是使用 Selenium 中的 waitForCondition 函数,一个 JavaScript 代码片段将被作为参数传递给该函数。一旦 Selenium 检测到条件返回为真,它将停止等待。您可以等待一些元素或文本出现或者不出现。JavaScript 可以运行在由 Selenium.browser.getCurrentWindow() 函数弹出的应用程序窗口中。清单 2 是检查窗口状态的样例代码。它只工作在 Firefox 中。

清单 2. 等待窗口就绪的状态

String script = “var my_window = selenium.browserbot.getCurrentWindow();”

script += “var bool;”;

script += “var readyState = (my_window.document.readyState);”;

script += “if (readyState == ‘complete’){“;

script += “bool = ‘true’;”;

script += “}”;

script += “bool;”;

selenium.waitForCondition(script, timeoutInMilliseconds);

如何支持 dojo 应用程序

Dojo 是一个常用的 JavaScript 工具包,用于构造动态 web 界面。使用 Selenium 测试 Dojo 应用程序时的一个关键点是认识 Dojo 小部件和记录它们的操作。作者定义的 Dojo 小部件处于抽象级别。页面运行时,会将 Dojo 小部件转换成基本的 HTML 代码。存在很多由 Dojo 自动生成的 HTML 代码,因此,Dojo 小部件的认识可能与传统 HTML 小部件有些不同。

Dojo 小部件上执行的操作(包括文本字段、按钮复选框和单选按钮)可能与 HTML 小部件相同。但是,Dojo 在组合框上提供的日期选择器和其他额外的小部件可能需要特定的处理。

图 1. Dojo 组合框

使用 Selenium IDE 来记录图 1 中提供的组合框上选中的操作。单击向下箭头,会出现一个下拉列表。选中第三项 Stack(SWG)。记录的脚本提供在图 2 中。

图 2. Selenium IDE 记录的脚本

有时,只会由 IDE 生成第二行脚本。在这种情况下,添加单击箭头按钮的操作。对于上面的脚本,如果第一行被重新播放,那么它应该生成下拉列表。但是它不执行任何操作。对于多个 Dojo 小部件,单击并不真正执行单击操作。将 click(locator) 更改为 clickAt(locator, coordString) 或者 MouseDown(locator) 和 MouseUp(locator)。

对于下拉列表,等待时间应该相加。像图 2 中展示的脚本一样,选中项的单击操作将会刚好在单击向下箭头按钮之后执行。它可能会因为下拉列表没有出现而失败。简单地添加一个 pause 命令,或者使用 waitFor 命令等待菜单项元素出现,并继续执行下一个命令。

修改后的将会自动化 Dojo 组合框上的选择的脚本展示在图 3 中。

图 3. 修改后的在 Dojo 组合框中进行选择的 IDE 脚本

RC 代码展示在清单 3 中。

清单 3. 自动化 Dojo 组合框中选择操作的 RC 代码

selenium.clickAt(“//div[@id='widget_offeringType']/div/div”,””);

selenium.waitForCondition(“selenium.isElementPresent(\”offeringType_popup2\”)”, “2000″);

selenium.clickAt(“offeringType_popup2″,””);

图 4. 日期选择器

对于图 4 中的日期选择器例子,执行的操作可能不会被 IDE 记录。编写如下面清单 4 所示的 RC 代码。

清单 4. 自动化选择的 RC 代码

//click on the date field by id you defined;

selenium.clickAt(“dateBox”,”");

//wait for the drop down date box by id;

selenium.waitForCondition(“selenium.isElementPresent(\”widget_dateBox_dropdown\”)”, \

“2000″);

//click previous year 2008;

selenium.clickAt(“//span[contains(@class,'dijitCalendarPreviousYear')]“, “”);

//click on the month increase;

//previous month would contains ‘dijitCalendarIncrease’.

selenium.clickAt(“//img[contains(@class,'dijitCalendarIncrease')]“,”");

//click on the date such as 28 of current month; If you do not specify

//the td with the attribute of current month class, it will click \

on the //first 28 of previous month;

selenium.click(“//td[contains(@class,'dijitCalendarCurrentMonth')]/span[text()='28']“);

如本例所示,Dojo 应用程序不能通过简单的 IDE 记录进行测试。这些脚本有可能不能通过测试。脚本中有一些丢失的操作,或者操作并不真正工作。脚本应该调整成能够在 IDE 和 RC 中顺利地执行。对于复杂的 Dojo 小部件,一种可能的解决方案是使用 runScript(String) 函数,因为 Selenium 对 JavaScript 提供很好的支持。清单 5 提供一个 JavaScript 语句来模拟组合框选择。

清单 5. 运行 JavaScript 语句在组合框上进行选择

selenium.runScript(“dijit.byId(\”offeringType\”).setValue(\”Stack(SWG)”);”);

如何利用 Ant 构建 Selenium 测试

诸如 Ant 这样的集成工具可以方便地构建 Selenium 测试和顺畅地运行测试用例,无需单独启动 Selenium 服务器。如果 Selenium 测试由 TestNG 驱动,那么定义清单 6 所示 TestNG Ant 任务。清单 6 中假设 classpath 是 TestNG.jar 文件的文件路径。

清单 6. TestNG Ant 任务

<taskdef resource=”testngtasks” classpath=”testng.jar”/>

主要的目标是启动服务器、运行测试,然后停止服务器。这些任务按照 bulid.xml 中定义的顺序实现在清单 7 中。

清单 7. 启动服务器、运行测试用例并停止服务器的 Ant 任务

<target name=”run_test” description=”start,run and stop” depends=”dist”>

<parallel>

<antcall target=”start-server” />

<sequential>

<echo taskname=”waitfor” message=”Waitforproxy server launch” />

<waitfor maxwait=”2″ maxwaitunit=”minute” checkevery=”100″>

<http url=”http://localhost:4444/selenium-server/driver/?cmd=testComplete” />

</waitfor>

<antcall target=”runTestNG” />

<antcall target=”stop-server” />

</sequential>

</parallel>

</target>

代码更可取的地方是使用 waitfor 任务来测试 Selenium 服务器是否已成功启动,而不是暂停一段固定的时间。如果 URL http://localhost:4444/selenium-server/driver/?cmd=testComplete 可用,就意味着 Selenium 已经成功启动。在清单 7 中,它最多等待两分钟,并且每 100 毫秒在本地主机上检查一次 Selenium 服务器,以提供完整的 URL。

start-server 任务的详细内容定义在清单 8 中。Firefox profile 模板位置和其他参数可以指定在标记 <arg> 中。

清单 8. 详细的启动服务器的 Ant 任务

<target name=”start-server”>

<java jar=”lib/selenium-server.jar” fork=”true”>

<arg line=”-firefoxProfileTemplate ${selenium}/profile/” />

</java>

</target>

runTestNG 任务的详细内容定义在清单 9 中。testng 任务的常用属性包括 outputDir 和 xmlfileset。属性 outputDir 用于设置输出报告位置。属性 xmlfileset 用于包含启动 XML 文件。更多选项请参考 TestNG 正式网站。

清单 9. 运行测试用例的 Ant 任务

<target name=”runTestNG”>

<testng outputDir=”${testng.report.dir}” sourcedir=”${build}”

classpathref=”run.cp” haltOnfailure=”true”>

<xmlfileset dir=”${build}” includes=”testng.xml” />

</testng>

</target>

stop-server 任务的详细内容定义在清单 10 中。

清单 10. 停止 Selenium 服务器的 Ant 任务

<target name=”stop-server”>

<get taskname=”selenium-shutdown”

src=”http://localhost:4444/selenium-server/driver/?cmd=shutDown” ignoreerrors=”true” />

<echo taskname=”selenium-shutdown” message=” Errors during shutdown are expected” />

</target>

上面列出了关键任务。将它们组合到您的构建文件,以便利用 Ant 完成良好集成的测试。

如何支持测试 HTTPS 网站

随着互联网日益强调信息安全,越来越多的 web 应用程序在使用 SSL 身份认证。Selenium IDE 默认支持 HTTPS,但是 Selenium RC 不是这样的。Internet Explorer 和 Firefox 中的解决方案各不相同。

对于 IE,在 setup 目录下的 SSL 支持文件夹中在安装一个证书。如果使用的版本早于 Selenium-RC 1.0 beta 2,请使用 *iehta 运行模式,对于 Selenium-RC 1.0 beta 2 或更晚的版本,使用 *iexplore 运行模式。

如果测试 HTTPS 网站时出现一个如下所示的安全警告,那么单击 View Certificate 并安装 HTTPS 网站的证书。如果继续弹出警告,那么考虑在 IE 中进行配置。打开 Tool > Internet Options > Advanced,并取消选择 security 分类下的 Warn about invalid site certificates 和 Check for publisher’s certificate revocation。

图 5. 测试 HTTPS 网站时的安全警告

创建新的 Firefox 配置文件

对于 Firefox,遵循以下步骤创建定制的配置文件,然后重启服务器:

  • 关闭任何正在运行的 Firefox 实例。
  • 利用配置文件管理器 firefox -ProfileManager 启动 Firefox。
  • 创建一个新的配置文件。出现提示时,为配置文件选择一个目录。将它放在项目文件夹里面。
  • 选择配置文件并运行 Firefox。
  • 利用您将用于测试的自签名证书导航到 HTTPS URL。 出现提示时接受证书。这将在配置文件中创建一个异常。
  • 关闭浏览器。
  • 转到 Firefox 配置文件目录。
  • 删除该目录中除 cert_override.txt 和 cert8.db 文件之外的任何东西。

默认情况下,Selenium 将在启动 Firefox 的实例时创建一个新的配置文件。当您利用参数 -firefoxProfileTemplate /path/to/profile/dir 启动服务器时,Selenium 将使用一个部分配置文件(带有证书异常)作为创建新配置文件的基础。这将提供证书异常,而避免了使用整个配置文件带来额外的混乱。注意一下在 Selenium RC 1.0 Beta 2 或更晚版本中以 *firefox 模式,以及在 Selenium RC 1.0 Beta 2 之前的版本中以 *chrome 模式启动 Firefox。

对于运行模式,*chrome 或 *iehta 是较早版本 Selenium RC 中支持 HTTPS 和安全弹出处理的实验模式。自 Selenium-RC 1.0 beta 2 起,它们已经稳定成 *firefox 和 *iexplore 运行模式。请谨慎地根据所使用的 Selenium 版本而使用运行模式。

如何高效地认识不带 ID 属性的 web 元素

使用一个有含义的 ID 或名称是一种高效且方便的定位元素的方式。它也可以改善测试用例的可读性。但是为了每个元素具有一个有含义的、惟一的 ID(尤其是动态元素),Selenium 提供多种策略来认识元素,比如说 Xpath、DOM 和 CSS。

下面是一个样例,使用三种策略来定位图 6 中提供的动态表格中的一个元素。HTML 代码在清单 11 中。

图 6. 动态表格样例

清单 11. 第一个表格列的 HTML 代码

<table id=”test_table” border=”1″>

<tbody>

<tr>

<td align=”left”>

<div>Test 1</div>

</td>

<td align=”center” style=”vertical-align: top;”>

<table id=”AUTOGENBOOKMARK_4″>

<tbody>

<tr>

<td align=”center” style=”vertical-align: top;”>

<div>

<img alt=”supported” src=”supported.png”/>

</div>

</td>

<td align=”center” style=”vertical-align: top;”>

<div>

<a href=”test?name=test1″>edit</a>

</div>

</td>

…….

Xpath 是一种找到不带特定 ID 或名称的元素的简单方式。

如果知道 ID 或名称之外的一个属性,那么直接使用 @attribute=value 定位元素。

如果只知道属性值的一些特定部分,那么使用 contains(attribute, value) 定位元素。

如果元素没有指定的属性,那么利用 Firebug 搜索最近的具有指定属性的父元素,然后使用 Xpath 从这个元素开始定位想要找到的那个元素。

表 1. 定位元素的 Xpath 表达式

表 1 展示了定位元素的 Xpath 表达式。在 Firebug 的帮助下,Xpath 可以定位元素和复制的元素。在元素没有 ID 和名称时,Selenium IDE 将会采用 Xpath。尽管 Xpath 利用已经录的脚本,有助于保持一致性,但是它高度依赖于 web 页面的结构。这使得测试用例可读性差,增加了维护难度。此外,在 Internet Explorer 7 和 Internet Explorer 8 中运行具有多个复杂 Xpath 表达式的测试用例可能会太慢了。在这种情况下,将 Xpath 更换为 DOM,后者是另一种高效的定位策略。

DOM 是 Document Object Model(文档对象模型)的缩写。Selenium 允许您利用 JavaScript 遍历 HTML DOM。Java 的灵活性允许在 DOM 表达式中有多个语句,用分号隔开,以及在语句中定义函数。

表 2. 定位元素的 DOM 表达式

表 2 展示了定位元素的 DOM 表达式。DOM 定位器在 Firefox 和 Internet Explorer 中也有很好的性能。组织 DOM 表达式需要一些 JavaScript 知识。有时,DOM 表达式对于复杂的元素来说太长了,难以看懂(参见表 2 中提到的 Test 1 的编辑链接的表达式)。

CSS 定位器用于利用 CSS 选择器选择元素。当 HTML 代码具有良好的样式时,可以高效地利用 CSS 定位器。样例表达式展示在表 3 中。

表 3. 定位元素的 CSS 表达式

一般来说,选用熟悉的定位器表达式,并在脚本结构中保持一致。如果有多种表达式可执行,那么使用最高效的方式在 web 页面中定位元素。

如何处理弹出窗口

一般来说,操作都是在由 Selenium 启动的主窗口中执行。如果您想在一个由 window.open 函数生成的新窗口中执行操作,那么将焦点更换到新窗口。在弹出窗口中执行操作之后,焦点返回到主窗口。处理弹出窗口的过程定义在清单 12 中。

清单 12. 处理弹出窗口的样例代码

//wait for the popup window with timeout;

selenium.waitForPopUp(windowname, timeout);

//select the pop up window

selenium.selectWindow(popupWindowIdentifier);

//perform action on popup window and close the window;

….

//return to the main window use ‘null’

selenium.selectWindow(null);

windowname 是调用 window.open 函数的第二个参数。上面提到的 popupwindowIdentifier 是一个窗口标识符,可以是窗口 ID、窗口名称、title=the title of the window 或 var=javascript variable。如果弹出窗口的属性未知,但是真的定义了,那么使用 getAllWindowIds()、getAllWindowNames() 或 getAttributeFromAllWindows() 函数来检索弹出窗口的属性。

在最新版的 Selenium RC 1.0.1 中,Selenium 添加了像 selectPopUp(String) 和 deselectPopUp() 这样的方法,它们的功能在以前版本中由 selectWindow(String) 提供。

清单 13. 处理弹出窗口的弹出函数

//wait for the popup window with timeout;

selenium.waitForPopUp(“”, timeout);

//same as selenium.selectWindow

selenium.selectPopUp(“”);

//perform action on popup window and close the window;

….

//same as selenium.selectWindow(null);

selenium.deselectPopUp();

清单 13 展示了处理弹出窗口最简单的方式。您可以保留 waitForPopUp 和 selectPopUp 函数中的第一个参数为空。如果同时弹出多个窗口,请指定窗口属性。

如何处理上载/下载文件窗口

Selenium 使用 JavaScript 来模拟操作。因此,它不支持诸如上载窗口、下载窗口或身份认证窗口之类的浏览器元素。对于非主要窗口,配置浏览器跳过弹出窗口。

图 7. 安全信息窗口

跳过图 7 中安全信息窗口的解决方案是打开 Tools > Internet Options > Custom Level。然后启用 Display mixed content。

配置 Internet Explorer 跳过非主要窗口会减少或消除运行测试用例时不必要的处理。但是如果配置了 Firefox,那么将它保存为新的配置文件,并利用定制的配置文件启动服务器。在关于测试 HTTPS 网站的一节中提到了这样做的原因。

对于上载/下载窗口,最好是处理而不是跳过它们。为了避免 Selenium 的局限性,一种建议是使用 Java 机器人 AutoIt 来处理文件上载和下载问题。AutoIt 被设计来自动化 Window GUI 操作。它可以认识大多数 Window GUI,提供很多 API,并且很容易转换为 .exe 文件,这样的文件可以直接运行或者在 Java 代码中调用。清单 14 演示了处理文件上载的脚本。这些脚本的步骤是:

  • 根据浏览器类型确定上载窗口标题。
  • 激活上载窗口。
  • 将文件路径放入编辑框中。
  • 提交。

清单 14. 处理上载的 AutoIt 脚本

;first make sure the number of arguments passed into the scripts is more than 1

If $CmdLine[0]<2 Then Exit EndIf

handleUpload($CmdLine[1],$CmdLine[2])

;define a function to handle upload

Func handleupload($browser, $uploadfile)

Dim $title ;declare a variable

;specify the upload window title according to the browser

If $browser=”IE” Then ; stands for IE;

$title=”Select file”

Else ; stands for Firefox

$title=”File upload”

EndIf

if WinWait($title,”",4) Then ;wait for window with

title attribute for 4 seconds;

WinActivate($title) ;active the window;

ControlSetText($title,”",”Edit1″,$uploadfile) ;put the

file path into the textfield

ControlClick($title,”",”Button2″) ;click the OK

or Save button

Else

Return False

EndIf

EndFunc

在 Java 代码中,定义一个函数来执行 AutoIt 编写的 .exe 文件,并在单击 browse 之后调用该函数。

清单 15. 执行 AutoIt 编写的 .exe 文件

public void handleUpload(String browser, String filepath) {

String execute_file = “D:\\scripts\\upload.exe”;

String cmd = “\”" + execute_file + “\”" + ” ” + “\”" + browser + “\”"

+ ” ” + “\”" + filepath + “\”"; //with arguments

try {

Process p = Runtime.getRuntime().exec(cmd);

p.waitFor(); //wait for the upload.exe to complete

} catch (Exception e) {

e.printStackTrace();

}

}

清单 16 是处理 Internet Explorer 中下载窗口的 AutoIt 脚本。Internet Explorer 和 Firefox 中的下载脚本各不相同。

清单 16. 处理 Internet Explorer 中下载的 AutoIt 脚本

If $CmdLine[0]<1 Then Exit EndIf

handleDownload($CmdLine[1])

Func handleDownload($SaveAsFileName)

Dim $download_title=”File Download”

If WinWait($download_title,”",4) Then

WinActivate($download_title)

Sleep (1000)

ControlClick($download_title,”",”Button2″,”")

Dim $save_title=”Save As”

WinWaitActive($save_title,”",4)

ControlSetText($save_title,”",”Edit1″, $saveAsFileName)

Sleep(1000)

if FileExists ($SaveAsFileName) Then

FileDelete($SaveAsFileName)

EndIf

ControlClick($save_title, “”,”Button2″,”")

Return TestFileExists($SaveAsFileName)

Else

Return False

EndIf

EndFunc

AutoIt 脚本很容易编写,但是依赖于浏览器类型和版本,因为不同的浏览器和版本中,窗口标题和窗口控件类是不相同的。

如何验证警告/确认/提示信息

对于由 window.alert() 生成的警告对话框,使用 selenium.getAlert() 来检索前一操作期间生成的 JavaScript 警告的消息。如果没有警告,该函数将会失败。得到一个警告与手动单击 OK 的结果相同。

对于由 window.confirmation() 生成的确认对话框,使用 selenium.getConfirmation() 来检索前一操作期间生成的 JavaScript 确认对话框的消息。默认情况下,该函数会返回 true,与手动单击 OK 的结果相同。这可以通过优先执行 chooseCancelOnNextConfirmation 命令来改变。

对于由 window.prompt() 生成的提示对话框,使用 selenium.getPromt() 来检索前一操作期间生成的 JavaScript 问题提示对话框的消息。提示的成功处理需要优先执行 answerOnNextPrompt 命令。

JavaScript 警告在 Selenium 中不会弹出为可见的对话框。处理这些弹出对话框失败会导致异常,指出没有未预料到的警告。这会让测试用例失败。

参考资料

学习

阅读 “追求代码质量: 使用 Selenium 和 TestNG 进行编程式测试”,学习如何将 Selenium 与 TestNG 组合到一起。

阅读 “How to test AJAX sites with FitNesse and Selenium RC”。

一定要参考 Selenium Documentation

在 AutoIt 文档 中了解 AutoIt 的一般知识。

阅读 TestNG Ant Task

转自这里

发表在 自动化测试 | 标签为 , | 留下评论

纽约时报:苹果山狮系统值不值20美元

新闻来源:网易科技
7月26日消息,据国外媒体报道,苹果公司昨日发布了新一代Mac操作系统“山狮”(OS X 10.8,Mountain Lion)。这款新操作系统售价19.99美元,并号称增加了200多项新功能。《纽约时报》刊文为消费者解惑——这款新系统是不是货真价实。

以下为《纽约时报》发布的“苹果系统升级价目表”全文:

  一款新的Windows系统发布可是大事件。里面涉及大变动、大动周折的安装,价钱自然也是大大的。

  苹果对自家Mac电脑的OS X系统则有不同的想法。这款系统每年都会推出一个不那么重量级的新版本。安装花费15分钟,一键操作,价格也便宜到不足为奇。对周三发布的“山狮”(OS X 10.8,Mountain Lion)系统来说,其价格只有20美元——而且你还可以使用一份拷贝在多个Mac电脑上安装,不用序列号,也不用担心各种激活困扰。

  作为一名Mac用户,你自然会想:“山狮”值不值20美元?

  想要准确回答这个问题只有唯一一种方法,把每一块钱拆细,对照各种新功能来看其是否物有所值。

  苹果称在新系统中加入了“200多种新功能”。但其中的一些只是细微的调整(如Safari浏览器每天可以检查软件升级),或是只有技术高人才可理解的名词(Xsan,高性能的集群文件系统)。当然还有15项为中国用户设计的改进,这对苹果统治地球的计划固然有利,但和非汉语用户却无甚要紧。

  到底有什么真正切实的改动呢?

  “山狮”系统在继续加强由iPhone、iPad和其他Mac电脑组成的商业环境,为用户带上所谓“天鹅绒手铐”。举例来说,三个移动平台的应用程序现在也都出现在Mac中:便签、日程提醒与游戏中心(Game Center)。

  所有苹果设备间的通信都可以无线完成。这多亏了日臻成熟、免费的iCloud服务。邮件、日程表与联系人现在都可以通过iGadgets进行同步。手机上更改一个电话号码,平板电脑与Mac上的相应内容也会同步更新;在电脑上建立一个日程通知,无论在任何地方手机都能准点提醒。

  这是个实用且有些魔幻色浅的功能——前提是你拥有不止一款苹果设备。很明显,这家公司希望你做一个美妙花园中的幸福囚徒。

  这些同步应用的价值到底应该是多少呢?如果手机应用消费为1到2美元,电脑共享软件为20到30美元,那么这些新应用大概值7美元上下。

  新的提醒中心(Notification Center)也模仿了iPhone/iPad上的功能。这是一个深灰色的小面板,当用户在触摸板上拖动双指(或点击菜单栏按钮),它便可在屏幕上滑动。这里汇聚了所有提醒类信息,程序发布的提醒或警示,都被综合进一个可定制的细小列表页上:今天的约会、未读短信、软件升级、Twitter留言等等。

  这些消息都被集中到“山狮”的新警报系统中,在这里每个泡泡样式的提醒都会悄然划至屏幕的角落中。就像一个平端午餐、轻踮脚尖走进你房间的管家一样,若你正专心做事,他便会在桌边放下托盘,不引起丝毫注意。

  不过一直被信息气泡轰炸也是件烦心事,所以邮件应用的新VIP功能允许用户设置过滤名单,让配偶、老板或是维修工的信息永不错失,而屏蔽来自其他人的信息。很贴心,肯定可以值3.5美元。

  语音输入现在也加入到Mac中。双击键盘上的Fn键便可开始听写。

  这项功能使用的就是iPhone上的技术。所以免去用户训练语音的烦恼,也不用配置特殊的麦克风。但该功能需要连接互联网,而且准确度也不像广告中导演马丁·斯科塞斯表演的那样可人。尽管如此,这仍是个快速使用的功能,可以给上5.75美元。

  新的分享按钮好似扑救的强力门将,无处不在。在快捷菜单、窗口边缘、Safari浏览器或预览功能中都可以看到它的身影。

  你可以通过这个弹出菜单广播一切屏幕上的东西:相片、文档、一条链接、视频、文件。这些内容可以张贴在Twitter上,发到邮箱或短信中、添加到Flickr或Vimeo上,也可以直接传输到另一台Mac上。所有操作都无需另开一款应用或打开某个网页。(兼容Facebook则需要等到今秋的免费升级)

  分享菜单省时省力,使用频度高。值上10美元很轻松。

  最具革命性的或许要算Power Nap,这是苹果为最新笔记本电脑设计的一项功能。用户可以通过它更新网络上的数据,即使关机或休眠状态也没有影响。

  这项功能可以每隔一小时自激活一次——不会启动电脑上的风扇或指示灯——完成邮件查收、下载升级、备份等操作。当笔记本被重新开启时,所有信息均与时俱进。

  苹果称这项功能非常省电,但如果是很在意电力的用户,你可以修改Power Nap设定,保证其只在笔记本接驳电源时开启。很好,值11美元。

  Messages,也就是从前的iChat聊天程序,改进后也支持同步功能。无论何时同iCloud上的成员聊天,也不管对方是使用Mac、iPhone或是iPad,对话都会同时出现在双方的所有设备上。若外出时在手机上聊天,所有的记录都会记录在Mac电脑上的Messages中。有点可怕,也容易混乱,不过还是值3.35美元。

  AirPlay的镜像功能需要有Apple TV额外支持,不过真的很不错:一键点击便可将Mac屏幕上的任何图像——也包括声音——传输到电视上。

  已经实装在iPhone和iPad上的AirPlay让这项功能更加实用。你可以像其他屏幕发送图片,或是在课堂演示,或是播放网络视频。即使Apple TV不支持Hulu也不要紧了。

  对会议演示亦是如此,可以使用小巧的Apple TV来代替昂贵的投影仪。不错的功能,值12.87美元,对经常使用PowerPoint的人来说价值可能更高。

  并非所有项目都是全新的,苹果加工了去年不讨好的AutoSave自动存储功能,恢复了“另存为”和“恢复到存储”功能;看来更加容易混淆,而且支持的程序并没有多少。看来还得花时间学习存储文件。应该扣去3.25美元。

  试图将iPad上多点触摸功能移植到Mac触控板上的努力也没有太大成果。用三个手指向上扫动可以打开任务控制应用,展开四个手指可以浏览桌面,用四支手指向边上滑动可以在各种全屏应用中切换……不知道你是否能记住,所谓好心办坏事也应该减去1.77美元。

  另外,“山狮”目前只能通过下载获得。苹果这次没有通过其他任何方式出售这款软件。这对没有网速不高的用户来说的确是个“大山”,减1.2美元。

  最后还应该提到首发通常会出现的一些小Bug。苹果已经证实了这些Bug的存在,并表示会在短时间内解决。扣35美分吧。

  经过如此这般细致且科学的计算,售价20美元的“山狮”实际上值46.90美元。而且这还没有算上其他170项功能:预览Preview、看门人Gatekeeper(阻挡恶意软件)、新的屏保、Safari浏览器中统一的地址栏与搜索框、滚动条会在光标移动上去后变宽等等。

  总的来说,“山狮”是一款得体的、经过仔细思量后推出的升级。带来全新200项功能有些夸张,不过用20美元换10项天天都用的功能,还是不错。

发表在 apple | 标签为 | 留下评论

Android自动化测试之Monkeyrunner从零开始

最近由于公司在组织一个Free CoDE的项目,也就是由大家自己选择研究方向来做一些自己感兴趣的研究。由于之前我学过一点点关于android的东西,并且目前android开发方兴未艾如火如荼,但自动化测试还基本上属于新兴领域,接触的人并不多,所以我给我们团队提出研究android自动化测试方面的项目,果然得到大家一致的赞同,大家的兴致都很高,呵呵。于是二话不说,我们开始看看现在android平台上现有的一些自动化测试工具。经过网上的一番搜索和学习,我了解目前android SDK里自带的现成的测试工具有monkey 和 monkeyrunner两个。大家别看这俩兄弟名字相像,但其实是完完全全不同的两个工具,应用在不同的测试领域。总的来说,monkey主要应用在压力和可靠性测试上,运行该命令可以随机地向目标程序发送各种模拟键盘事件流,并且可以自己定义发送的次数,以此观察被测应用程序的稳定性和可靠性,应用起来也比较简单,记住那几个命令就行了。而monkeyrunner呢,相比之下会强大一些,它主要可应用于功能测试,回归测试,并且可以自定义测试扩展,灵活性较强,并且测试人员可以完全控制。

好了,废话不多说,我们直接进入主题吧。之所以想把这个过程写下来,是由于经过我这段时间在网上的搜索和学习,发现关于monkeyrunner的教程极少,几乎都是把android官方材料自己翻译了一下摆上去的,对于第一次接触的同学来说,可能还不太详细。我在这里就想以完全初学者的角度出来,真正从0开始,记录我的学习过程。本文仅针对真正的菜鸟,大虾们请飘过哈,嘿嘿。

要使用Monkeyrunner,我们首先得干神马呢?当然得准备使用环境。这个不外乎就是我们得事先安装好android的SDK,配置好开发环境(如Eclipse),安装好Python(因为Monkeyrunner其实是由Jython写的,直接调用android API来整的)。这些步骤网上都有非常详细的教程,教大家手把手地搭环境,我这里就不多废话了。

环境搭好后,接下来就开始我们的使用之旅了。网上的monkeyrunner很多都直接从实例代码入手,写得很粗略,也没有把详细步骤说明下来,搞得我确实废了两三天才摸到头绪。所以我这里会写得很详细,尽量帮助大家能够轻易地看懂。详细步骤如下(在模拟器上运行,由于不知道什么原因图片不能正常显示,所以我还是直接写命令吧):

1. 用Elipse打开andorid的模拟器或者在CMD中用andorid命令打开模拟器,如下:

D:\Software\Android SDK2.3\android-sdk-windows\tools>emulator -avd AVD2.3.3

Comments: 定位到android SDK的路径下的tools目录,运行上面这个命令。“AVD2.3.3”是我的模拟器的名字,这个命令是每个人自己命名的,用的时候需改成实际的名字。

2. 这个时候,如果一切正常的话,模拟器应该可以启动起来了。(运行monkeyrunner之前必须先运行相应的模拟器,不然monkeyrunner无法连接设备。这点很多教程上都没有说,我也试了好多次才明白过来)。接着,我们打开另一个CMD窗口(前一个不要关),还是定位到tools目录,输入命令”monkeyrunner”,回车,将进入shell命令交互模式。

好了,接下来就可以导入monkeyrunner所要使用的模块了。当然是我们的”From…import…”

直接在shell命令中输入: from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice  回车

OK,这步完成之后,我们就可以开始和模拟器“勾兑”了,哈哈,命令如下:

device = MonkeyRunner.waitForConnection()

没有报错的话,就代表和模拟器勾兑成功,我们可以接着“骚扰”它了。接下来,我们可以在里面装点东西了。输入如下命令,并传入你的apk所在相对路径即可。我这安装的是著名的ApiDemos。成功了会返回true。如果没有返回true,一般都是语法错误或者你传入的相对路径有问题,仔细检查下就没问题了。

device.installPackage(“../samples/android-10/ApiDemos/bin/Apidemos.apk”)

接下来,我们就可以启动其中的任意activity了,只要传入package和activity名称即可。命令如下:

device.startActivity(component = “com.example.android.apis/com.example.android.apis.ApiDemos”)

此时模拟器会自动打开ApiDemos这个应用程序的主页。

接下来我们还可以给模拟器发送更多的操作,如模拟任何按键时间和滚动等,并且可以截图。命令格式和上述命令类似,我就不再累述了。

当然,我们也可以不这样麻烦得一行行地输入命令,可以将从“from…import…”开始的所有后面的语句都写到一个python文件里面,例如 monkeyrunnerTest.py,然后我们再从命令行直接通过monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:

D:\Software\Android2.3.3\android-sdk-windows\tools>monkeyrunner monkeyrunnerTest.py

接下来monkeyrunner会自动调用monkeyrunnerTest.py,并执行其中的语句,相当方便。

今天暂时先写到这里,今天主要的关键是明白了如何使得monkeyrunner和模拟器进行正确的连接和相关的操作,具体的monkeyrunner的方法和属性大家可以参考官方的文档,上面非常详细了,呵呵。

转自51Testing

发表在 自动化测试, 软件测试 | 标签为 , | 留下评论

开发人员为什么拒绝修改我的缺陷

缺陷是测试过程中测试人员的重要输出,它不仅是和其他项目利益相关者进行沟通的桥梁,也是证明测试人员测试能力的重要手段。但是,在实际的测试过程中,测试人员提交的缺陷常常会被开发人员以各种理由拒绝。
为了减少被软件开发人员拒绝的缺陷的数目,首先需要了解为什么开发人员会拒绝测试人员提交的缺陷,或者说他们为什么不愿意花费时间和精力解决测试人员提交的缺陷。本文将从几个不同的视角分析缺陷被拒绝的原因,从而有针对性的提出一些建议,帮助测试人员尽量减少被开发人员拒绝的缺陷的数目。开发人员拒绝研究和修改缺陷的原因是多方面的,例如:

  1. 开发人员无法复现缺陷(无法复现);
  2. 缺陷报告中提供的信息不足,或者复现缺陷需要奇怪而复杂的步骤(难以理解);
  3. 开发人员认为是系统的一个功能点,而测试人员认为是一个缺陷(缺陷还是功能点);
  4. 开发人员不理解测试人员的角色和职责定位(测试人员的角色);

1)缺陷无法复现
开发人员拒绝研究和修复测试人员提交的缺陷的第一个可能理由是:这个缺陷我无法复现,或者这个问题在我的环境中并没有发现。
在测试过程中,测试人员经常会碰到一些不可复现或者很难复现的问题,特别是在进行非功能性测试的时候,例如:稳定性测试、压力测试、满配置测试、兼容性测试等。通常来说,这些难以复现的问题,其导致的结果一般都是比较严重的,例如:系统性能不稳定,系统随机重启等。同时,这些问题常常也是用户最关注的地方。假如用户在使用过程中出现这样的严重问题,将会极大的降低用户对产品的信心。
即使是难以复现的问题,建议测试人员还是需要提交缺陷报告。只是,测试人员在提交缺陷报告之前,需要采取一些合适的策略和建议,尽量为开发人员定位和修复这样的问题提供合适的信息,帮助他们尽快解决问题。我的建议包括:

  1. 首先,测试人员养成这样的习惯:打开系统的调试窗口(假如系统提供),时时记录测试过程中系统的打印信息。发现系统的异常表现的时候,测试人员就可以捕获其中异常的系统打印信息,这些信息可以帮助开发人员跟踪和定位缺陷发生的原因,从而有利于开发人员解决这种类型的缺陷;
  2. 其次,测试人员碰到系统的异常表现的时候,可以先判断该问题是否可能难以复现。假如觉得难以复现,测试人员可以先保留当前的测试环境,要求开发人员到现场来定位和分析其中可能的原因。假如开发人员可以从当前的环境中分析得到可能的原因,那么测试人员编写缺陷报告就可以轻松得多;
  3. 第三,测试人员报告不可复现的缺陷的时候,应该在缺陷报告中明确告知开发人员不可复现或者难以复现,从而避免在有限的时间和资源情况下,开发人员过多的将精力放在这样的缺陷修改上面;
  4. 第四,建议测试人员提交难以复现的缺陷,组织内可以不断的收集和分析难以复现的缺陷数据库。定期浏览这些缺陷,并进行集中的分析,可能会在不同的缺陷描述中发现一些共同的或者可能有联系的信息,有助于问题的解决;

2)缺陷报告难以理解
开发人员拒绝测试人员提交的缺陷的第二个可能理由是:缺陷报告中提供了太多的内容和信息,开发人员甚至不知道测试人员想说什么,也很难了解测试人员想阐述的问题是什么。
缺陷报告是测试过程中测试人员的重要输出。很多的时候,项目利益相关者通过缺陷报告认识测试人员。好的缺陷报告可以为测试人员带来良好的声誉,而差的缺陷报告可能会为利益相关者带来额外的工作。如果测试人员的缺陷报告,浪费了项目利益相关者太多的时间和资源,他们潜意识中就会抵制和拒绝他们的缺陷报告。
编写良好的缺陷报告是测试人员应该具备的几个基本技能。高效的缺陷报告,对测试人员而言具有重要的意义,除了可以减少被开发人员拒绝的缺陷数量,也有助于提高测试人员的可信度、改善开发人员和测试人员之间的合作关系。
好的缺陷报告是测试人员在测试过程中发现了什么,而不仅仅是告诉开发人员我们做了什么。这对于编写高质量的缺陷报告很重要。另外,我们在编写缺陷报告的时候,还应该使缺陷报告尽量具备以下特征:

  1. 精简的:缺陷的描述应该是清晰而简要的。首先在缺陷报告中剔除不必要的语言。其次,不要增加无关的信息。在缺陷报告中包含所有缺陷相关的信息,并且确实是相关的。多余的信息只会增加缺陷描述的含糊不清;
  2. 正确的:提交的问题确实是一个缺陷。假如提交的缺陷最后证明是由于理解错误或者配置错误引起的,测试人员将在开发人员面前失去可信度,同时会对彼此之间的沟通带来一些影响;
  3. 隔离:尽量寻找简短的步骤来复现缺陷,即将缺陷进行隔离。例如:哪个模块中发生了问题?是哪个输入条件触发了这个缺陷?是哪个动作引起了这个失效等。对问题的隔离定位能力,很大程度上可以为测试人员加分,同时可以提高大家的测试效率和项目整体的效率;
  4. 推广:确定系统其他部分是否可能也存在同样的问题,以及使用不同的数据时是否也会出现这种问题等等。测试人员在缺陷方面的推广能力,可以帮助节约开发人员修改缺陷的时间,同时提高缺陷解决的效率;
  5. 复现:确定系统是否可以复现这个问题,需要什么样的步骤输入来复现这个问题。对于能够复现的问题,提供简单的步骤和输入。对于难以复现的问题,尽量提供一些告警信息、日志信息给开发人员,或者问题发现时,可以和开发人员一道进行跟踪调试和定位。对于实在无法复现的问题,在缺陷报告中明确说明,并且在后续测试中留意跟踪;
  6. 证据:如同写测试用例需要测试条件一样,在缺陷报告中,测试人员需要提供测试的期望结果和实际结果,参考文档是什么?

除了上面的要求之外,测试人员在编写好缺陷报告之后,假如时间允许,可以请求有经验的测试人员或者测试经理,在提交缺陷报告之前阅读一遍。这有助于缺陷报告质量的提高。
3)缺陷还是功能点
开发人员拒绝测试人员提交的缺陷的第三个可能理由是:他们认为这是一个正常的功能特性(或者功能点),而测试人员认为这是一个问题。
引起开发人员和测试人员对系统的同一个表现行为出现分歧的主要原因,可能是他们对系统的输入,例如:需求文档的理解不一样。通过合理的定义系统人员、开发人员和测试人员的角色和职责定义,可以较好的解决这样的问题。下面是三者关系的示意图:

上图说明了系统人员是软件开发和软件测试的基础和核心。通过系统人员将产品的用户需求转化为详细的需求规格说明。在需求规格说明基线化后,软件人员以此作为基础进行系统概要设计和详细设计,而测试人员根据需求规格说明来进行软件测试策略和详细测试用例的设计。同时,软件人员和软件测试人员都需要和系统人员紧密合作和交流,将各个阶段的开发活动和测试活动得到的信息反馈给系统人员,来完善和优化系统需求规格说明。按照这样角色和职责的定义,假如开发人员和测试人员针对某个产品的表形行为有分歧的时候,可以通过系统人员来做最后的决定。通过软件开发过程控制和管理,开发人员和测试人员就可以较好的避免纠缠“是缺陷还是功能点”此类问题,从而提高我们的测试效率,同时也可以更好的实现项目利益相关者之间的沟通。
4)测试人员的角色
开发人员拒绝测试人员提交的缺陷的第四个可能理由是:产品的需求规格中并没有这样要求,需求规格中的功能和特性已经实现了。
引起这个问题的原因主要是开发人员对测试人员角色和职责的定位不清楚。假如开发人员并不能很好的理解测试人员的工作,那么开发人员和测试人员之间在缺陷方面的沟通也会存在一些问题。那么,测试人员的角色和职责应该是什么呢?我们认为测试应该是贯穿于整个软件开发生命周期,而不仅仅只是代码阶段之后的测试执行活动。这里引入Verification和Validation两个概念:
验证(Verification):通过检查和提供客观证据来证实指定的需求是否满足。也就是说,输入与输出之间的比较。也就是说,是检验软件是否已正确地实现了产品规格所定义的系统功能和特性,即“Are you building the product right”。
确认(Validation):通过检查和提供客观证据来证实特定功能或应用是否已经实现。在确认时,应考虑使用和应用的条件范围要远远大于输入时确定的范围。一般是由客户或代表客户的人执行。也就是说,是确认所开发的软件是否满足用户真正需求的活动,即“Are you building the right product”。
根据Verification和Validation两个概念,我们可以看到,测试人员除了要验证产品是否正确实现了需求规格说明之外,他还需要站在客户的角度,分析产品是否真的是客户所要求的。因此,测试过程中,测试人员除了报告功能性的缺陷之外,特别需要注意一些非功能的特性,特别是用户所关注而需求规格中可能并没有明确定义的要求,例如:产品是否容易使用,图形界面是否布局合理等。
前面分别谈了开发人员拒绝修复测试人员提交的缺陷4个主要原因,以及根据笔者的经验提出的一些建议。当然,测试过程中我们肯定还会碰到其他的一些原因,导致开发人员不愿意修复某些缺陷。例如:项目进度紧张,在当前版本中不修复,延期到后续版本中修复;当前技术无法实现,或者实现需要对系统架构实现大的变更,可能引入更大的风险。不管是什么原因,都需要我们测试人员具备良好的沟通能力、规范严谨的缺陷报告编写能力,以及通过良好的合作让开发人员更好的理解测试工作,从而达到更好更快的发现和修复缺陷,实现高质量产品的及时发布。

转自http://www.skyqa.com

发表在 软件测试 | 标签为 , | 留下评论

如何进行 IOS 移动设备的软件测试

1.整个系统介绍

iOS现在的最新版本iOS5.1.1是5月8号推出 。

先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPhone和iTouch的系统基本一致,iPad区别的地方主要是分辨率尺寸上的区分

接着软件部分,就是常说的os部分,现在常见的系统是4.2.1/4.3.3/4.3.5/5.1.0/5.1.1,其中4.3.3以上的版本iPad版本支持手势,5.0.0以上版本支持通知栏和icloud,其中5.0.0和4.x相差较多,apple号称的修改点有200多

第三对于各个app来说,每个app都有一些固定信息,app的id(区分app的唯一标识),显示的名称(包括app安装后显示名和在appstore上的显示名),支持的iOS版本(最低支持的os版本,一般是支持iOS4.0以上,但是对于不同的app因为应用到了不同的系统功能,故要求的iOS版本也会不同,以后要求iOS5.0版本的app也会多起来的)

2.安装

1)官方的安装方式

可以PC/MAC机上下载好,然后用itunes同步到机器上,或者直接在机器上到appstore上下载到本机然后下载,这是最普通和官方的安装方式,但是只能使用已经在appstore上线的app,对于测试的版本基本无意义

2)越狱

越狱/破解,现在5.0.1版本有完美破解,以上的版本只有不完美破解,以后可能会有完美方式(注,不完美破解是不能重启机器),越狱之后的机器就可以不受限制的装各种app到机器上,对于测试版本来说比较方便

3)开发机模式

开发机模式是一个俗称,正式名字其实我也不是很清楚,大家明白即可,一个apple的发布者账户,可以支持100台设备,即可以生成100个不同SN串号的证书安装到机器上,这样发布者账户编译出来的版本就可以安装到对应的开发机上,证书可以在设置通用描述文件中找到,当然apple的发布者账户还有其他两种类型:企业账户和学生用账户,这2个账户是不能将app发布到appstore的,这里就不具体说明了

4)OTA模式

OTA不是一个新鲜的东西,以前很多的手机软件都是如此安装,可以直接从机器上访问安装地址安装,最为方便,前提是机器是破解的或者已安装开发者证书,移动这边现在基本上正在开发的项目都是有这样的安装方式,简化安装步骤

以上是一些不同的安装方式,其他还有91助手/同步助手等第三方工具安装,但是这些只是一些辅助方式区别,app能否安装取决于apple账户有没有购买过此app和此机器上有没有对应apple账户登录,购买可以认为是一种添加证书许可动作,开发者证书也是一种,而越狱则是绕过了证书验证

3.兼容性

1)硬件兼容性

三种设备中iPhone和iTouch设备基本一致,iPad因为分辨率和尺寸上不同,一般的客户端都会分开开发,如果是全兼容的app,那么需要兼顾测试,而全兼容性的app需要多考虑的是怎样在pad和phone的屏幕上设计一个兼顾型的展现,不过这是交互和视觉设计师需要考虑的地方

回到分开开发的模式中,iPhone和iTouch可以认为是同一种设备,差异很小,主要的差异也就是在来电和短信中断方面,另一个要注意的就是iPad可以安装只适用iPhone/iTouch的app,以兼容模式显示,此时基本上可以认为是在一个iTouch上运行此app

同一类设备不同机型的兼容性,一共是iPhone有5代,iPad有2代,iTouch有4代,机器之间的差异对于app来说主要就是内存和CPU的性能和打完包后的大小以及分辨率的适配,iPhone4和iTouch4及以上是用640*960分辨率,以下是低分辨率机器,4代之前之后的CPU用的不同,所以编译版本时要兼容2种CPU,随着the new iPad的推出iPad现在也有2种分辨率和CPU都需要能够兼容,同一个app的iPhone版本往往比iPad版本的安装包文件要大,基本上就是CPU和分辨率这2种原因

就硬件兼容性来说,基本上iPhone的客户端要测2个机器(3代和4代各一,iPhone和iTouch随意),iPad客户端需要准备2种测试机 the new iPad 和(iPad或iPad2)

2)系统兼容性

前面也说了,常见的系统是4.3.3/4.3.5/5.1.0/5.1.1,有条件是尽量测试,但是因为iOS版本只能往上升级,要降级需要越狱和保存SHSH,所以一般尽量保证4.3.3/4.3.5或者5.1.0/5.1.1的版本,4.x和5.x的版本据apple列了200多点,其中还有各种不确切的问题,所以一定需要测试,4.2.1版本是因为iPhone和iTouch2代只能升级到此os版本,用户量很少,而iPad的用户也只有早期且不升级的才有此os,国内用户量很少

按照apple的以往做法,支持低版本的iOS的app,都可以在高版本上正常运行,系统级别上向下兼容,但是也有不少例外,特别是一些自定义的控件,直接使用系统提供的控件一般不会有问题

系统方面的兼容性除了要保证功能正确以外,还要考虑一些新os上才支持的功能,在老os上的表现,而apple现在还在不停的更新os,故要提前保证新的beta版本os的兼容状况

3)其他软件兼容性

其实也没有什么其他软件,iOS系统中允许app调用的也只有通讯录照片浏览器等系统自带的软件,也有内嵌和重新打开界面这2种状态,而重开界面时系统会将当前软件保留,所以一般不会有界面方面的问题

4.用户体验

功能方面因为各个app都是不同的,所以就不展开了,简单的介绍下一些用户体验需要注意的地方:

滑动拖动翻页等动画效果

各个页面的旋转屏幕,特别是iPad的客户端

多点触摸手势,各种手势定义下的效果展示,以及iOS中尽量不要出现长按菜单的功能,这是android上的默认效果,iOS上长按大多是进入一个特别的状态

按钮意义要明显,如果使用了过多的文字说明,不是个好主意

5.性能

前文有介绍各种机器,因为新机器的性能往往是最好的,所以我的观点是测试就用差点的机器吧 =.=

iOS的内存管理是优先保证当前,有多少用多少,超过上限不够用直接关闭app,也就是常说的crash,自动退出,所以内存回收方面需要注意,也可以在开发机上直接监控内存使用量,不过内存监控只能看到整个app的使用量,看不到具体模块的使用,而os4.0以上每个关掉的app系统会自动保存一个最小镜像,当内存不够用的时候会连此镜像都关闭,这就是有时候开启app能看到关闭前的界面有些只能看到loading页面的原因,特别是游戏类的app会有这样的现象,另外,越狱的机器的可用内存会大约小不少。

CPU部分就简单了,iOS的机制保证了CPU占用量很高的情况很少出现,一般多数据多线程时会有卡和停顿的状况就是CPU不够用了,这也只能靠设计上来避免了

网络部分,主要是2g/3g/wifi的速度,但是这个性能指标要根据不同的情况来考虑,一般来说对比同类app的效果即可

6.webapp

现在杭研有不少webapp类的项目在进行,因为我只是简单的看了下,就随便说下我的理解,大家有问题尽管提

webapp的优点是开发迅速和维护简单,大部分功能是用html5来完成的,所以客户端的开发工作比较少,而且大部分功能的维护修改也只要在前端修改html代码即可,不用升级客户端版本,可以节约很多不同客户端兼容覆盖安装等工作

缺点也比较明显,功能上还是做不到和客户端一样的效果,使用时需要较多的网络流量,需要有不少工作需要前端来完成

个人觉得比较类似flash网页游戏和客户端类游戏的样子,facebook据说客户端都是采用此类方式开发,他们有一个强大的mobile web库,对于测试来说,即使是webapp,依然要向客户端类的体验靠拢

该文转自 这里,经过略微修改

发表在 apple, 软件测试 | 标签为 , , | 留下评论

做为测试工程师,我们需要一个认证吗?

经常在各种坛子里看到有人问关于测试认证/培训的问题。不仅国内的问,国外也有许多人在关心这一类的问题。下面是我翻译自Google Group中的Software Testing (QC) & Software Quality Assurance (QA) 组的一个讨论。我觉得里面的许多信息可以给大家一些启示。
因为这些信息都是翻译来的,版权属于讨论组和作者,所以请大家不要引用全部或者部分的内容。
这个讨论最早是一个来自Nepal-尼泊尔的测试工程师发起的。
**************
Binayak :测试认证真的很重要吗?这些认证真的可以在实际工作中提供帮助吗?如何能,它们如何帮助我们测试?在CSTE/ CSQA / ISTQB / ISEB 这些认证中,哪个是最好的?他们有什么区别?这些认证是否可以教给我们处理不同类型的测试对象?
谢谢!
**************
你这个问题类似于你的大学学历对于工作有用吗?
还是让我们回到认证培训是否有用上来吧。
1>如果你是一个新手或者2-4年经验的测试者,认证培训可以给你比其他人更多的相关知识和技能。
2>通过认证可以帮助你获得关于软件测试的全局的视野,帮助你明白什么是测试以及你未来的方向。
认证也不能说明你学习了多少东西。谁想通过认证换取工作或者认为认证能增加身价,谁就是傻子。
认证并不能带来工作,只能带来面试电话。如果你肚子里面有货,才能在面试中有精彩的回答。我(作者,不是lz–lz注)有一个朋友在面试中被问道测试计划的组成,他用了5分钟做阐述。你能做到吗?如果能,你就是千里马。如果不能,你和被刷掉的那些人就是一路货色。所以,如果你拿到的认证和你的资历、能力不符合,那就是无用的。
现在用各种认证来妆点简历已经越来越时髦了,这是因为获得这些认证既便宜用容易。通过了最好,如果没有通过也不会留下什么负面的印记。我通过了ISTQB的培训,我知道有些人只准备了很短时间就通过了。(其实ISTQB初级也没有那么容易了,这位印度哥们的朋友们估计比较强。–lz注)我认为应该增大难度,降低ISTQB的通过率。
你的测试能力才是你的核心竞争力,而非那些证书。
如果你在通过认证的过程中经过了认真系统的学习,那确实可以帮助你扩充知识。如果只是为了考试,那对你的用处就很有限。
我知道这些认证类型之间的区别,但是你要告诉我你想知道哪些方面以便于我回答
**************
Robert Lambert
这个讨论很激烈,回复很多。我个人的观点是测试认证只能给你最基本的对测试的理解,只能在某些程度上帮助你获得面试机会并增加面试时的专业性。
但是,通过认证不能使你成为一个好的测试工程师。仅仅依靠好的回答也不足以给你带来一份工作。你需要在面试中解释你是如何开展工作的,你在测试中的角色,良好的沟通能力要比任何的认证都有用。
有一个James Bach搞的质量博客汇总了类似的认证的信息,有兴趣可以看一下。
http://www.satisfice.com/blog/archives/130
如果有人拿到了认证并且吹嘘他了解了测试中的所有东西,那他就是在愚弄自己。参加一些课程,阅读网络上关于测试有关的那些资料和主题可以给你更多的帮助。网上有太多的让人兴奋的免费的有关软件测试的资料分享,事实是这些资料给你的帮助要比认证还大。所以如果你对测试这个职业是认真的–开始阅读他们吧。
任何人都可以通过一个礼拜的实例学习外加一些多项选择题的联系就通过ISTQB/ISEB考试(其实任何的认证考试都大同小异 –lz注)并获得认证。但是把这些人放到压力下、需求易变的实际工作环境中,就是另外的一回事情了。通过认证只是涵盖了你做为测试工程师的诸多素质中的一点点。
**************
Mark Crowther
如果你有时间和金钱的话,去拿几个认证吧。学习的过程可能会给你带来启发而且这些认证也会让雇员/客户有信任感。
在职业上任何能促使你学习和思考的东西都是好的,只是不要认为你有了认证就有了一切。
**************
Binayak
组里有人提出了一个观点:你不会到一个没有通过认证的大夫开的诊所去就诊。
对于这个观点,我也有一个看法:如果你的大夫用了两天半时间学习然后通过了一个认证,你会信任他吗?我想不会吧。认为一份测试工程师的工作必须认证证书才可以的一般都是HR部门的白痴们,他们对测试可以说狗屁不通。不幸的是,这些白痴过滤掉了太多有天分的人的简历。
在不同的地区,人们对于认证的理解是不同的。在北美,如果一个职位需要大量的认证,你最好还是放弃吧,因为你可以很容易的找到不需要这么些认证的职位。如果一个职位需要认证,我根本不去投这个职位的简历。
对那些认为认证提供了一个标准的模式和术语的同学们,我的观点是:这又怎样?每个新工作都意味着新的术语、准则,甚至每个工作组都有不同的术语和准则。如果你想花钱请人来“标准”你的语言表达,那么,估计你真的要花很多钱哦。测试是一个为项目最大广大参与者提供的服务,是一个妥协的过程,太多的标准和准则有时会给项目组带来伤害。
如果你想成为一个好的测试工程师,有太多的资源可以帮助你成长,太多的书籍、博客、讨论组可以帮助你。如果你是个新手(或者是一个想改进能力的有一些经验的人),我可以推荐给你一个免费的黑盒测试课程(BBST),是由Cem Kaner和James Bach创建的(http://www.testingeducation.org/BBST/)
如果那些认证可以帮助你获得标准的术语和模型,BBST课程也可以提供给你类似的材料。当我在面试新人的时候,我经常可以见到那些知道许多术语模型但是根本没有深入见解,甚至张冠李戴的人。相比之这些鱼目混珠之流,我宁可雇佣一个没有认证的没有经过训练但是对学习新技术有热切渴望的诚实的人。
立刻开始进入测试行业,努力的工作和学习以获取经验和知识,你就会发现认证并不是你简历中必须的部分。如果在你那部分世界(指国家–lz)必须要一个认证才能工作,那么需要哪个你就去考哪个。
但是请不要认为获得了认证你就可以停止学习、思考、分析你的技能。

转自这里

发表在 软件测试 | 标签为 | 留下评论

解决Dropbox无法实时更新的问题

本文背景是,中国到dropbox的http连接会被重置,但是https连接不受影响。如果背景改变了,则本文失效。本文主题是让dropbox客户端的http请求经socks代理访问dropbox服务器,而https请求不经代理直接访问,用这种方法来解决Dropbox客户端目前无法实时更新的问题。

现象:在国内的多个电脑客户端使用同一个Dropbox帐号登录,实现协同办公等操作,但是一台电脑更新文件后,无法实时同步到其他电脑客户端。而在国外的网络环境没有这种现象。

原因:目前在国内,dropbox被关键字屏蔽(Wildcard: .dropbox.com),但是客户端还能正常使用,因为客户端和服务器之间使用的是https加密传输。但只有一处是没有使用https的,就是 stork47.dropbox.com(笔者是这个地址,其他地方可能不一样)。这个服务器负责将服务器端(或其他客户端)发生的文件更新通知到其他客户端(笔者猜的,但应该差不多),然后其他客户端才会发起https请求去和服务器同步这些文件。实际中,是客户端每60秒向 stork47.dropbox.com查询一次,看是否有文件需要更新。因为该请求没有使用https连接,导致连接一直被RESET,所以某台客户端的更新无法实时反映到其他客户端。

因为一般人可能没有这个需求,所以没多少人关注这个课题。像我以前也只是在家里和公司同步一些文件而已,没有实时更新的必要。有强烈需求的人,就设置让客户端全程走代理,可以解决上述问题,缺点是文件的更新速度受代理服务器速度的影响,大多数情况下没有直接连接的速度快。还有一部分人当需要更新时,直接重启客户端(甚至为此写了个脚本),因为客户端只在启动时才使用https连接检查更新,这样做的缺点显而易见。

解决Dropbox无法实时更新的问题

解决方法:最近用privoxy,发现它可以做到分流http和https,于是试验了一下,果然可以分流dropbox的客户端请求了。就是前面说的,让http 请求走代理,而https请求不走。这样即满足了实时更新的需求,又兼顾了更新速度,可谓智能代理了。privoxy还有不少替代方案笔者没有试过的,比如polipo之类。以下是操作步骤。

1,需要准备的东西:dropbox客户端、代理软件、privoxy。该方案应该与平台无关,但是笔者只在windows 7下试验过。

2,打开privoxy的配置文件config.txt,在最后面添加这几行:

#   for dropbox: http –> SOCKS Proxy(19841), https –> direct
forward-socks5   .dropbox.com             127.0.0.1:19841 .
forward          .dropbox.com:443         .

注意将19841修改为你自己的代理软件的端口。如果你的代理软件不是socks类型的,那么就不是加上面的几行,而是加这几行:

#   for dropbox: http –> HTTP Proxy(19842), https –> direct
forward          .dropbox.com             127.0.0.1:19842
forward          .dropbox.com:443         .

注意好多地方有半角的.号,不要弄丢了。

3,启动privoxy,将dropbox的代理设置为HTTP 127.0.0.1:8118,就OK了。

如果有疑问可以留言讨论,如果有关于软件的其他用法的问题请另行google。

转自月光博客

发表在 GTD | 标签为 | 一条评论

常用的网站功能测试方法

网站功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:

1、页面链接检查: 每一个链接是否都有对应的页面,并且页面之间切换工具,如LinkBotPro、File-AIDCS、HTML Link Validater、Xenu等工具。LinkBotPro不支持中文,中文字符显示为乱码;HTML Link Validater只能测试以Html或者htm结尾的网页链接;Xenu无需安装,支持asp、do、jsp等结尾的网页,同时能够生成html格式的测试报告。

2、相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确检查按钮的功能是否正确 如新建、编辑、删除、关闭、返回、保存、导入等功能是否正确。

3、字符类型检查:在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型。

1)标点符号检查:输入内容包括各种标点符号,特别是空格,各种引号,回车键。看系统处理是否正确。

2)特殊字符检查:输入特殊符号,如@、#、$、%、!等,看系统处理是否正确。

3)字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度。

4、中文字符处理:在可以输入中、英文的系统输入中文,看会否出现乱码或出错。

检查信息的完整性 在查看信息和更新信息时,查看所填写的信息是不是全部更新,更新信息和添加信息是否一致。

5、信息重复:在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理。

6、检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按“delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理。

7、检查添加和修改是否一致:检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型

8、检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错

9、重复提交表单:一条已经成功提交的纪录,返回后再提交,看看系统是否做了处理。对于Web系统检查多次使用返回键的情况 在有返回键的地方,返回到原来页面,重复多次,看会否出错

10、搜索检查:有搜索功能的地方输入系统存在和不存在的内容,看搜索结果是否正确.如果可以输入多个搜索条件,可以同时添加合理和不合理的条件,看系统处理是否正确。

11、输入信息位置:注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方。

12、上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。下载文件能否打开或者保存,下载的文件是否有格式要求,如需要特殊工具才可以打开等。

13、必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加“*”;对必填项提示返回后,焦点是否会自动定位到必填项。

14、快捷键检查:是否支持常用快捷键,如Ctrl+C、 Ctrl+V、 Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。

15、回车键检查:在输入结束后直接按回车键,看系统处理如何,会否报错。

16、刷新键检查:在Web系统中,使用浏览器的刷新键,看系统处理如何,会否报错。

17、回退键检查:在Web系统中,使用浏览器的回退键,看系统处理如何,会否报错。对于需要用户验证的系统,在退出登录后,使用回退键,看系统处理如何;多次使用回退键,多次使用前进键,看系统如何处理。

18、直接URL链接检查:在Web系统中,直接输入各功能页面的URL地址,看系统如何处理,对于需要用户验证的系统更为重要。

19、空格检查:在输入信息项中,输入一个或连串空格,查看系统如何处理。如对于要求输入整型、符点型变量的项中,输入空格,既不是空值,又不是标准输入。

20、输入法半角全角检查:在输入信息项中,输入半角或全角的信息,查看系统如何处理。如对于要求输入符点型数据的项中,输入全角的小数点(“。”或“.”,如4.5);输入全角的空格等。

21、密码检查:一些系统的加密方法采用对字符Ascii码移位的方式,处理密码加密相对较为简单,且安全性较高,对于局域网系统来说,此种方式完全可以起到加密的作用,但同时,会造成一些问题,即大于128的Ascii对应的字符在解密时无法解析,尝试使用“uvwxyz”等一些码值较大的字符作为密码,同时,密码尽可能的长,如17位密码等,造成加密后的密码出现无法解析的字符。

22、用户检查:任何一个系统,都有各类不同的用户,同样具有一个或多个管理员用户,检查各个管理员之间是否可以相互管理,编辑、删除管理员用户。同时,对于一般用户,尝试删除,并重建同名的用户,检查该用户其它信息是否重现。同样,提供注销功能的系统,此用户再次注册时,是否作为一个新的用户。

23、系统数据检查:这是功能测试最重要的,如果系统数据计算不正确,那么功能测试肯定是通不过的。数据检查根据不同的系统,方法不同。对于业务管理平台,数据随业务过程、状态的变化保持正确,不能因为某个过程出现垃圾数据,也不能因为某个过程而丢失数据。

24、系统可恢复性检查:以各种方式把系统搞瘫,测试系统是否可正常迅速恢复。

GUI基本测试内容

图形用户界面( GUI )对软件测试提出了有趣的挑战,因为 GUI 开发环境有可复用的构件,开发用户界面更加省时而且更加精确。同时, GUI 的复杂性也增加了,从而加大了设计和执行测试用例的难度。因为现在 GUI 设计和实现有了越来越多的类似,所以也就产生了一系列的测试标准。下列问题可以作为常见 GUI 测试的指南:

原文链接:http://www.ltesting.net/ceshi/ceshijishu/gncs/2011/0825/203127.html

发表在 软件测试 | 标签为 , | 一条评论

软件测试中不需要测试的八件事

不要测试它
做为一名测试人员,我们也许会问我们自己很多问题:
● 我们可以立即执行的最好的测试是什么?
● 我将要使用的测试方法是什么?
● 这是一个Bug吗?
● 我已经测试完成了吗?

但是我们之中会有多少人提出以下的这些问题呢?
● 这个组件需要一直被测试到吗?
● 需要由我来测试它吗?
● 如果它不工作,谁会去在意它呢?

在我看来,我们提出的问题中和以上三个问题类似的还远远不够。可能这是因为我们已经被告知要测试一切东西。甚至我们的一部分人会在其质量团队中有一个流程,要求某个人把每一个组件都贴上“已测试”的标签。我们对待测试就像一个常规的工厂程序,我们甚至有时候引以自豪的说…
“我是测试工程师。因此,所有的东西都需要被测试…由我来做…即使非测试人员已经测试过了…即使我已经知道它将会通过测试…即使需要一个程序员告诉我怎么去测试…我必须测试它,没有例外!”
这类想法可能会让测试人员有一个坏名声。由于欠缺思考的过程导致它强调了测试的重要性,而不是给一些人提供最有价值信息的服务。
James Bach 带着以下的测试观点出现:
基本的观点:“如果它存在,我就要去测试它”
正如前面内容和我经常发布的文章中,我不同意这个观点。尽管如此,我完全同意James 在2006年8月7日,他在博客发布的完整版本中关于这部分的介绍:
“如果它存在,我就要去测试它(唯一的例外是我有更重要的事情要做)”
第二句话是可以有很多的理解方式!为什么呢?因为我们经常会有更重要的事情去做,通常是另外的测试工作!不幸的是,重要性往往不是区分的很明显。所以与其衡量重要性,我更喜欢提出上面的三个问题,去寻找那些可能不值得浪费我的时间去测试的东西。下面八个例子是我讨论的内容:
0. 不会在产品中出现的组件- 我的团队中在每次迭代中都有这些内容。例如增强功能中的错误记录表或者跟踪生产活动中的审查报告。在敏捷开发的团队中这些被归入开发者用户故事(Developer User Stories)。这些内容不会随便的在产品中出现并且由于其本质不会直接影响到用户。
1. 关键产品问题的补丁不会很糟糕 – 一天下午客户给我们的技术支持打电话,由于我们的产品的一个阻塞性质的bug导致他们处于错过一个关键最后期限(DeadLine)的边缘。我们只有一个小时交付修复的产品。程序员很快的修复了问题,由于当前的产品是无效的,所以对修复之后进一步的产品存在的风险来说这是微不足道的。想要当英雄吗?不要让事情慢下来。快速的让产品通过测试。如果需要以后再去测试。
2. 界面问题修复要有适度的准备时间 – 我们修复了一个在屏幕上出现的用户错误消息中的拼写错误。用户并没有察觉到拼写错误但是我们无论如何修复了问题。很快而且简单。触发这个错误消息需要30分钟的准备时间,值得吗?
3. 直接了当的配置改变 – 去年我们产品开始偶尔出现很大的作业不能处理的问题。一个程序员尝试改变通用配置修复问题。但在QA的环境中没有一个简单的方法去创建一个足够大的作业超过这个临界值,很难去测试。我们在产品中修改了配置然后用户很高兴的为我们做了测试。
4. 技术性的需要非程序员的测试 – 测试部分功能时需要实施某种行为而在代码中设置断点来复现竞态条件.有时测试人员与工具和程序员精通产品代码的知识并不匹配。讨论这个测试但是回避它。
5. 非测试人员借用 – 如果团队中一个非测试人员帮忙去做测试工作,或者更重要的,想帮忙测试某一组件,让他去做吧。跟他分享测试的思路并且跟他要测试报告。如果你觉得满意,不需要再去测试它了。
6. 没有复现步骤- 程序员偶尔会尝试某些东西。经常会出现一些错误报告,但是没有人能对这些错误给出确切的重现步骤。我们也许想对修改的区域做回归测试,但是我们发布的时候不会阻止这种明显的修复,因为我们不知道它管不管用。
7. 不足的测试数据或硬件 – 让我们面对它吧。在我们QA的环境中,根据产品中所需要,大部分情况我们没有足够多负载平衡服务器。当一个有效的测试需要的资源在产品使用环境之外不可用时,我们可能无法对其进行测试。

很多人也许尝试想像上面这些如果不去测试会导致的问题。我也会做这些。记住,这些事情也许不值得花费我们的时间去测试。再次权衡你所做的事情,如果在不是很清楚的时候,去问问利益相关者。
如果你选择不去测试某些东西,很重要的是,不能被我误导。这是在我的团队中使用到方法。在我们进行组件审查时,我们的(测试人员)说,“我们将不会去测试这些”。如果有人反对,我们会改变我们的想法并且测试它。如果没有人反对,我们就“未经审查即批准(rubber stamping)”。即表明没有被测试就让它通过这样可以让他进入到最终产品。
所以下次你发现你自己正在着手做的测试,感觉比其他你应该做的事情更不重要时,你应该需要考虑…不去测试它。逐渐的,你的团队将会尊重你的决定并受益于更少的瓶颈,以及在你实际增加的价值的地方增长的覆盖率。

发表在 软件测试 | 标签为 , | 留下评论