现在做iOSjava做接口自动化测试试的人怎么这么少

238被浏览48,456分享邀请回答4129 条评论分享收藏感谢收起Python实践之路zhuanlan.zhihu.com
392 条评论分享收藏感谢收起iOS 自动化测试的那些干货-ZAKER新闻
CocoaChina
前言如果有测试大佬发现内容不对,欢迎指正,我会及时修改。大多数的 iOS
App ( 没有持续集成 ) 迭代流程是这样的也就是说,测试是发布之前的最后一道关卡。如果 bug 不能在测试中发现,那么 bug 就会抵达用户,所以测试的完整性和可靠性十分重要。目前,大多数 App 还停留在人工测试阶段,人工测试投入的成本最低,能够保证核心功能的使用,而且测试人员不需要会写代码。但是,在很多测试场景下,人工测试的效率太低,容易出错。举两个常见的例子:一个 App 的核心功能,在每一次发布版本前的测试必定会跑一遍所有的测试用例,不管对应的业务在当前版本有没有变化(天知道开发在做业务 A 的时候,对业务 B 有没有影响),如果这次测出新的 bug,测试人员在下一次发版测试中,又不得不做这些重复的工作。开发在写 API 请求相关代码的时候没有做数据容错,测试在人工测试的时候都是正常的数据,所以测试通过。上线了之后,后台配置数据的时候出了点小问题,导致大面积崩溃,boom~。然后,老板就要过来找你了本文所讲解的均是基于 XCode 8.2.1,有些概念可能不适用于低版本的 XCode自动化测试自动化测试就是写一些测试代码,用代码代替人工去完成模块和业务的测试。其实不管是开发还是测试,如果你在不断的做重复性工作的时候,就应该问自己一个问题:是不是有更高效的办法?自动化测试有很多优点:测试速度快,避免重复性的工作避免 regression,让开发更有信心去修改和重构代码 ( 个人认为最大的优点 ) 具有一致性。有了自动化测试,持续集成(CI)会变得更可靠。迫使开发人员写出更高质量的代码。(自动化测试不通过,代码不允许合并)当然,自动化测试也有一些缺点。开发和维护成本高。不能完全替代人工测试。无法完全保证测试的准确性 - 让代码去判断一段逻辑是否正确很容易,但是,让代码判断一个控件显示是否正确却没那么容易。所以,在做自动化测试之前,首先要问自己几个问题?这个测试业务的变动是否频繁?这个测试业务是否属于核心功能?编写测试代码的成本有多少?自动化测试能保证测试结果的准确么?通常,我们会选择那些业务稳定,需要频繁测试的部分来编写自动化测试脚本,其余的采用人工测试,人工测试仍然是 iOS App 开发中不可缺少的一部分。测试种类从是否接触源代码的角度来分类:测试分为黑盒和白盒(灰盒就是黑盒白盒结合,这里不做讨论)。白盒测试的时候,测试人员是可以直接接触待测试 App 的源代码的。白盒测试更多的是单元测试,测试人员针对各个单元进行各种可能的输入分析,然后测试其输出。白盒测试的测试代码通常由 iOS 开发编写。黑盒测试。黑盒测试的时候,测试人员不需要接触源代码。是从 App 层面对其行为以及 UI 的正确性进行验证,黑盒测试由 iOS 测试完成。从业务的层次上来说,测试金字塔如图:而 iOS 测试通常只有以下两个层次:Unit,单元测试,保证每一个类能够正常工作UI,UI 测试,也叫做集成测试,从业务层的角度保证各个业务可以正常工作。框架选择啰里八嗦讲的这么多,自动化测试的效率怎么样,关键还是在测试框架上。那么,如何选择测试框架呢?框架可以分为两大类:XCode 内置的和三方库。选择框架的时候有几个方面要考虑测试代码编写的成本是否可调式框架的稳定性测试报告(截图,代码覆盖率,…)WebView 的支持(很多 App 都用到了 H5)自定义控件的测试是否需要源代码能否需要连着电脑是否支持 CI(持续集成)… .我们首先来看看 XCode 内置的框架:XCTest。XCTest 又可以分为两部分:Unit Test
UI Test,分别对应单元测试和 UI 测试。有一些三方的测试库也是基于 XCTest 框架的,这个在后文会讲到。由于是 Apple 官方提供的,所以这个框架会不断完善。成熟的三方框架通常提供了很多封装好的有好的接口,笔者综合对比了一些,推荐以下框架:单元测试:以下三个框架都是 BDD (
) - 行为驱动开发。行为驱动开发简单来说就是先定义行为,然后定义测试用例,接着再编写代码。
实践中发现,通常没有那么多时间来先定义行为,不过 BDD 中的 domain-specific language ( DSL ) 能够很好的描述用例的行为。
老牌测试框架
另一个 BDD 优秀框架
三个项目中 Star 最多,支持 OC 和 Swift,优先推荐。UI 测试
基于 XCTest 的测试框架,调用私有 API 来控制 UI,测试用例用 Objective C 或 Swift 编写。
基于 Client - Server 的测试框架。App 相当于一个 Server,测试代码相当于 Client,通过发送 JSON 来操作 APP,测试语言可以是任意的,支持 android 和 iOS。篇幅有限,本文会先介绍 XCtest,接着三方的 Unit 框架会以 Quick 为例,UI Test 框架侧重分析 KIF,appium 仅仅做原理讲解。XCTest对于 XCTest 来说,最后生成的是一个 bundle。bundle 是不能直接执行的,必须依赖于一个宿主进程。关于 XCTest 进行单元测试的基础 ( XCode 的使用,异步测试,性能测试,代码覆盖率等 ) ,我在这篇文章里讲解过,这里不再详细讲解。单元测试用例比如,我有以下一个函数:// 验证一段 Text 是否有效。(不能以空字符开头,不能为空)-
( BOOL ) validText: ( NSString
error: ( NSError
*__autoreleasing
* ) error{}那么,我该如何为这个函数编写单元测试的代码?通常,需要考虑以下用例:输入以空白字符或者换行符开头的,error 不为空,返回 NO输入正确的内容,error 为空,返回 YES输入为 nil,error 不为空,返回 NO ( 边界条件 ) 输入为非 NSString 类型,验证不通过,返回 NO (错误输入)特殊输入字符(标点符号,非英文等等)UI 测试UI 测试是模拟用户操作,进而从业务处层面测试。关于 XCTest 的 UI 测试,建议看看 WWDC 2015 的这个视频:关于 UI 测试,有几个核心类需要掌握UI 测试还有一个核心功能是 UI Recording。选中一个 UI 测试用例,然后点击图中的小红点既可以开始 UI Recoding。你会发现:随着点击模拟器,自动合成了测试代码。(通常自动合成代码后,还需要手动的去调整)在写 UI 测试用例的时候要注意:测试行为而不是测试代码。比如,我们测试这样一个 case进入 Todo 首页,点击 add,进入添加页面,输入文字,点击 save。测试效果如下:对应测试代码:-
( void ) testAddNewItems{
// 获取 app 代理
XCUIApplication
[ [ XCUIApplication
// 找到第一个 tabeview,就是我们想要的 tableview
XCUIElement
[ app.tables
elementBoundByIndex:0 ] ;
// 记录下来添加之前的数量
table.cells.
// 点击 Add
[ app.navigationBars [ @"ToDo" ] .buttons [ @"Add" ]
// 找到 Textfield
XCUIElement
*inputWhatYouWantTodoTextField
app.textFields [ @"Input
// 点击 Textfield
[ inputWhatYouWantTodoTextField
// 输入字符
[ inputWhatYouWantTodoTextField
typeText:@"somethingtodo" ] ;
// 点击保存
[ app.navigationBars [ @"Add" ] .buttons [ @"Save" ]
// 获取当前的数量
table.cells.
// 如果 cells 的数量加一,则认为测试成功
XCTAssert ( newCount
1 ) ;}这里是通过前后 tableview 的 row 数量来断言成功或者失败。等待通常,在视图切换的时候有转场动画,我们需要等待动画结束 , 然后才能继续,否则 query 的时候很可能找不到我们想要的控件。比如,如下代码等待 VC 转场结束,当 query 只有一个 table 的时候,才继续执行后续的代码。 [ self
expectationForPredicate: [ NSPredicate
predicateWithFormat:@"self.count
evaluatedWithObject:app.tables
handler:nil ] ; [ self
waitForExpectationsWithTimeout:2.0
handler:nil ] ;// 后续代码 ....Tips: 当你的 UI 结构比较复杂的时候,比如各种嵌套 childViewController,使用 XCUIElementQuery 的代码会很长,也不好维护。另外,UI 测试还会在每一步操作的时候截图,方便对测试报告进行验证。查看测试结果使用基于 XCTest 的框架,可以在 XCode 的 report navigator 中查看测试结果。其中:Tests 用来查看详细的测试过程Coverage 用来查看代码覆盖率Logs 用来查看测试的日志点击图中的红色框指向的图标可以看到每一步 UI 操作的截图除了利用 XCode 的 GUI,还可以通过后文提到的命令行工具来测试,查看结果。Stub/Mock首先解释两个术语:通常,如果你采用纯存的 XCTest,推荐采用 OCMock 来实现 mock 和 stub,单元测试的三方库通常已集成了 stub 和 mock。那么,如何使用 mock 呢?举个官方的例子://mock 一个 NSUserDefaults 对象 id
userDefaultsMock
OCMClassMock ( [ NSUserDefaults
class ] ) ;// 在调用 stringForKey 的时候,返回 http://testurlOCMStub ( [ userDefaultsMock
stringForKey:@"MyAppURLKey" ] ) .andReturn ( @"http://testurl" ) ;再比如,我们要测试打开其他 App,那么如何判断确实打开了其他 App 呢?id
OCMClassMock ( [ UIApplication
class ] ) ;OCMStub ( [ app
sharedInstance ] ) .andReturn ( app ) ;OCMVerify ( [ app
openURL:url ] 使用 Stub 可以让我们很方便的实现这个。关于 OCMock 的使用,推荐看看 objc.io 的这篇文章QuickQuick 是建立在上的框架,使用允许你动态创建测试用例。所以,使用 Quick, 你仍让可以使用 XCode 的测试相关 GUI 和命令行工具。使用 Quick 编写的测试用例看起来是这样子的:import
Quickimport
Nimbleclass
TableOfContentsSpec:
describe ( "the
'Documentation'
directory" )
everything
started" )
Directory ( "Documentation" ) .sections
expect ( sections ) .to ( contain ( "Organized
Groups" ) )
expect ( sections ) .to ( contain ( "Installing
Quick" ) )
context ( "if
it ( "needs
updated" )
You ( awesome:
expect{you.submittedAnIssue}.toEventually ( beTruthy ( ) )
}}BDD 的框架让测试用例的目的更加明确,测试是否通过更加清晰。使用 Quick, 测试用例分为两种:单独的用例 - 使用 it 来描述it 有两个参数,行为描述行为的测试代码比如,以下测试 Dolphin 行为,它具有行为 is friendly 和 is smart//Swift 代码 class
DolphinSpec:
friendly" )
expect ( Dolphin ( ) .isFriendly ) .to ( beTruthy ( ) )
expect ( Dolphin ( ) .isSmart ) .to ( beTruthy ( ) )
}}可以看到,BDD 的核心是行为。也就是说,需要关注的是一个类提供哪些行为。用例集合,用 describe 和 context 描述比如,验证 dolphin 的 click 行为的时候,我们需要两个用例。一个是 is loud, 一个是 has a high frequency,就可以用 describe 将用例组织起来。class
DolphinSpec:
describe ( "a
dolphin" )
describe ( "its
Dolphin ( ) .click ( )
expect ( click.isLoud ) .to ( beTruthy ( ) )
frequency" )
Dolphin ( ) .click ( )
expect ( click.hasHighFrequency ) .to ( beTruthy ( ) )
}}context 可以指定用例的条件:比如describe ( "its
context ( "when
interesting" )
expect ( dolphin!.click ( ) .count ) .to ( equal ( 1 ) )
}}除了这些之外,Quick 也支持一些切入点,进行测试前的配置:beforeEachafterEachbeforeAllafterAllbeforeSuiteafterSuiteNimble由于 Quick 是基于 XCTest,开发者当然可以收使用断言来定义测试用例成功或者失败。Quick 提供了一个更有好的 Framework 来进行这种断言:Nimble比如,一个常见的 XCTest 断言如下:XCTAssertTrue ( ConditionCode,
"FailReason" ) 11在出错的时候,会提示XCAssertTrue
balabala这时候,开发者要打个断点,查看下上下文,看看具体失败的原因在哪。使用 Nimble 后,断言变成类似expect ( 1
1 ) .to ( equal ( 2 ) ) expect ( 3 )
2expect ( "seahorse" ) .to ( contain ( "sea" ) ) expect ( [ "Atlantic",
"Pacific" ] ) .toNot ( contain ( "Mississippi" ) ) 并且,出错的时候,提示信息会带着上下文的值信息,让开发者更容易的找到错误。让你的代码更容易单元测试测试的准确性和工作量很大程度上依赖于开发人员的代码质量。通常,为了单元测试的准确性,我们在写函数 ( 方法 ) 的时候会借鉴一些函数式编程的思想。其中最重要的一个思想就是何为 Pure function?就是如果一个函数的输入一样,那么输出一定一样。比如,这样的一个函数就不是 pure function。因为它依赖于外部变量 value 的值。static
( NSInteger ) function_1{
1;}而这个函数就是 pure function,因为给定输入,输出一定一致。-
( NSInteger ) function_2: ( NSInteger ) base{
1;}所以,如果你写了一个没有参数,或者没有返回值的方法,那么你要小心了,很可能这个方法很难测试。关于 MVC在良好的 MVC 架构的 App 中,View 只做纯粹的展示型工作,把用户交互通过各种方式传递到外部Model 只做数据存储类工作Controller 作为 View 和 Model 的枢纽,往往要和很多 View 和 Model 进行交互,也是自动化包括代码维护的痛点。所以,对 Controller 瘦身是 iOS 架构中比较重要的一环,一些通用的技巧包括:逻辑抽离:网络请求独立。可以每个网络请求以 Command 模式封装成一个对象,不要直接在 Controller 调用 AFNetworking。数据存储独立。建立独立的 Store 类,用来做数据持久化和缓存。共有数据服务化(协议)。比如登录状态等等,通过服务去访问,这样服务提供者之需要处理服务的质量,服务使用者则信任服务提供者的结果。Controller 与 View 解耦合建立 ViewModel 层,这样 Controller 只需要和 ViewModel 进行交互。建立 UIView 子类作为容器,将一些 View 放到容器后再把容器作为 SubView 添加到 Controller 里建立可复用的 Layout 层,不管是 AutoLayout 还是手动布局。Controller 与 Controller 解耦合如果你的 App 用开发,那么面向协议编程和不可变的值类型会让你的代码更容易测试。当然,iOS 组建化对自动化测试的帮助也很大,因为不管是基础组件还是业务组件,都可以独立测试。组建化又是一个很大的课题,这里不深入讲解了。KIF的全称是 Keep it functional。它是一个建立在 XCTest 的 UI 测试框架,通过 accessibility 来定位具体的控件,再利用私有的 API 来操作 UI。由于是建立在 XCTest 上的,所以你可以完美的借助 XCode 的测试相关工具(包括命令行脚本)。& KIF 是个人非常推荐的一个框架,简单易用。使用 KIF 框架强制要求你的代码支持 accessibility。如果你之前没接触过,可以看看 Apple 的文档简单来说,accessibility 能够让视觉障碍人士使用你的 App。每一个控件都有一个描述 AccessibilityLabel。在开启 VoiceOver 的时候,点击控件就可以选中并且听到对应的描述。通常 UIKit 的控件是支持 accessibility 的,自定定义控件可以通过代码或者 Storyboard 上设置。在 Storyboard 上设置:通过代码设置: [ alert
setAccessibilityLabel:@"Label" ] ; [ alert
setAccessibilityValue:@"Value" ] ; [ alert
setAccessibilityTraits:UIAccessibilityTraitButton ] ;如果你有些 Accessibility 的经验,那么你肯定知道,像 TableView 的这种不应该支持 VoiceOver 的。我们可以用条件编译来只对测试 Target 进行设置:#ifdef
DEBUG [ tableView
setAccessibilityValue:@"Main
Table" ] ;#endif#ifdef
KIF_TARGET
( 这个值需要在 build
settings 里设置 ) [ tableView
setAccessibilityValue:@"Main
Table" ] ;#endif使用 KIF 主要有两个核心类:KIFTestCase XCTestCase 的子类KIFUITestActor 控制 UI,常见的三种是:点击一个 View,向一个 View 输入内容,等待一个 View 的出现我们用 KIF 来测试添加一个新的 ToDo-
( void ) testAddANewItem{
tapViewWithAccessibilityLabel:@"Add" ] ;
enterText:@"Create
intoViewWithAccessibilityLabel:@"Input
tapViewWithAccessibilityLabel:@"Save" ] ;
waitForTimeInterval:0.2 ] ;
waitForViewWithAccessibilityLabel:@"Create
item" ] ;}命令行自动化测试中,命令行工具可以 facebook 的开源项目:这是一个基于 xcodebuild 命令的扩展,在 iOS 自动化测试和持续集成领域很有用 , 而且它支持 -parallelize 并行测试多个 bundle,大大提高测试效率。安装 XCTool,brew
xctool11使用path/to/xctool.sh
-workspace
YourWorkspace.xcworkspace
YourScheme
plain:/path/to/plain-output.txt
run-test并且,xctool 对于持续集成很有用,iOS 常用的持续集成的 server 有两个:优化你的测试代码准确的测试用例通常,你的你的测试用例分为三部分:配置测试的初始状态对要测试的目标执行代码对测试结果进行断言(成功 or 失败)测试代码结构当测试用例多了,你会发现测试代码编写和维护也是一个技术活。通常,我们会从几个角度考虑:不要测试私有方法(封装是 OOP 的核心思想之一,不要为了测试破坏封装)对用例分组(功能,业务相似)对单个用例保证测试独立(不受之前测试的影响,不影响之后的测试),这也是测试是否准确的核心。提取公共的代码和操作,减少 copy/paste 这类工作,测试用例是上层调用,只关心业务逻辑,不关心内部代码实现。一个常见的测试代码组织如下:appiumappium 采用了 Client Server 的模式。对于 App 来说就是一个 Server,基于对实际的 UI 操作库进行了封装,并且暴露出 RESTFUL 的接口。然后测试代码通过 HTTP 请求的方式,来进行实际的测试。其中,实际驱动 UI 的框架根据系统版本有所不同:原因也比较简单:Apple 在 10.0 之后,移除了 UIAutomation 的支持,只支持 XCUITest。对比 KIF,appium 有它的优点:跨平台,支持 iOS,Android测试代码可以由多种语言编写,这对测试来说门槛更低测试脚本独立与源代码和测试框架当然,任何框架都有缺点:总结由于我不是专业的 iOS 测试,关于测试的一点见解如下:单元测试还是选择 BDD 框架,毕竟可读性高一些,推荐(Swift), ( Objective C ) UI 测试优先推荐,如果需要兼顾安卓测试,或者测试人员对 OC/Swift 很陌生,可以采用参考资料
相关标签:
原网页已经由 ZAKER 转码排版
凤凰科技1小时前
驱动之家8小时前
凤凰科技昨天
凤凰科技昨天
凤凰科技昨天
凤凰科技昨天
超能网昨天
腾讯科技6小时前
腾讯科技8小时前
腾讯科技8小时前
驱动之家2小时前
太平洋电脑网2小时前
IT之家3小时前
钛媒体10小时前
IT之家6小时前【图文】豆瓣ios自动化测试实践和经验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
豆瓣ios自动化测试实践和经验
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【转帖】如何做一个能害死人的自动化测试工具 | Hello world!小组 | 果壳网 科技有意思
130041人加入此小组
今天看到qq群里有人发消息 招能开发自动化测试工具的测试工程师 于是搜索了一下开发自动化测试工具到底需要具备啥技能或知识于是发现了下面这篇神文:你是一家大公司里不得志的程序员。和你同年进公司的那些人在核心业务上拼命工作,被客户骂,加班,交付,开庆功会,拿奖金。而你,不知道怎么的被放到一个叫做“测试工具开发”的边角部门里,干着一些不疼不痒不影响公司业绩的工作。你恨。你要报复。你要拿回本该属于自己的一切。现在我教你怎么做。首先,你要启动一个自主开发自动化测试工具的项目。让老板们相信自动化测试的重要性并不困难,世界上有无数的文章和书籍在讲这件事,你们公司请的咨询顾问一定也会说到这件事,这些都是你的帮手。真正难的部分是“自主开发”。你用得上一个百试百灵的招数。告诉老板们,一个自主开发的工具可以由自己来维护和支持,只有这样才能把核心技术的命脉掌握在自己手里,而不用向别人支付维护支持的费用──小心,千万不要提到那些开源的工具,因为老板们万一真的弄懂了“开源”这两个字的含义,你的整个大计划就泡汤了。拿IBM的RFT当靶子。除了后面我会说到的各种好处之外,IBM的咨询价格足以帮你吓到老板从而启动这个项目。然后,你要精心选择一个自动化测试执行引擎。你需要这么一个引擎,因为你不能自己去做一个──工作量还在其次,要是连这都能做,你也就不在这个边角部门里郁闷了。同时这个引擎又不能太稳定,更不能太开放,这都是你大计划中不可或缺的要素。所以,你看,我说过了,RFT就是最好的靶子:它的开放程度确保了你要花好几个月时间才能把它嵌在自己的工具里而且以后再也不会有别人尝试干这件事。而且,想想吧,当你跟老板们报告说你hack了IBM的软件从而省下了licence费用时,他们该有多开心。接下来,你要发明一套自己的测试脚本语法。沿用RFT的语法当然轻松,但这样使用它的人就会发现自己使用的其实是RFT,然后在该死的互联网上找到相关的资料。不能让这样的事发生。始终记住,你的目标是让自己变得重要。你发明的语法应该基于XML。不仅因为实现简单,而且因为它能确保测试脚本无法被阅读和重构,从而让使用这工具的人跪在你脚边求你支持。关于使用XML的好处,稍后我还会说到。当然你不希望向领导演示时用记事本编辑XML。所以你得同时实现一个支持拖拽的测试用例编辑界面。把一个测试步骤表示为一个图标,把几个图标往测试用例里一拖,一个测试用例就好了。别忘了,执行用例的功能也得在这个界面里实现。千万别为了偷懒而实现一个命令行来执行用例,这很重要。好了,现在你可以去演示了,领导一定会喜欢的。“鼠标拖拽其实比键盘输入慢多了!”旁边一个傻逼顾问叫喊着。领导们不会听懂他的话。不用理会他,更不要尝试跟他争论,那只会给你自己带来麻烦。现在这个工具可以小范围试用了。那些麻烦的用户会抱怨:“我每次都要重复这几个同样的操作!我想把它们合并成一个步骤!”镇静。不要骂他们(尽管你一直就想骂他们)。记得吗?让测试用例不可被重构是你大计划中的一部分。现在你要笑容可掬说。我们早就考虑到了这个问题,我们的工具可以把几个步骤封装成一个更大的、具有业务含义的东西,,,,嗯,姑且把它叫做“操作词汇”吧。现在我就来帮助你们做这个抽象和封装。当然了,操作也要用XML来承载,并且在提供给用户时要先做一次编译或者打包或者加密,总之是不能让他们看到源文件。这样他们才能永远依赖你。小范围试用很重要。你必须努力工作,帮用户写测试用例,帮他们封装操作,找你能找到的一切资源来帮他们,然后把投入二十个人月干出来的成果全都描述成你的工具带来的神奇变化。放心,你只需要这么干一次(或者两次)。为了把这些愚蠢的家伙踩在脚下,有时你就得先纡尊降贵。这是策略。试用结束,你回到自己的办公室,这些愚蠢的用户还会不停地找你帮忙更新被封装的操作。这是设计中的一环。现在你应该做一个中央服务器,把他们的测试用例和操作全都保存在上面,让他们每次执行测试都从服务器上取用例脚本。然后告诉他们,这叫云计算,这叫测试工厂。当然这些傻瓜不会懂得云计算是什么玩意,但他们会发现你帮他们更新操作的速度变快了,然后他们就会认为这就是云计算带来的效果。把他们感谢你的话搜集起来,很快你就会用得上。现在万事俱备,可以向老板汇报了。这次汇报的重点是两个关键词。这也是今后宣传这个工具时的常用语。一定要背熟。关键词1:“第四代自动化测试工具”。你要告诉老板,用Java啦Ruby啦C#啦这些编程语言来编写测试用例,那是第三代(前两代是什么就随便你编吧)。第四代的特征就是“基于操作词汇”──也就是图形界面上可以拖的那个玩意,尽管你知道它背后就是一坨不能读、不能改、连SVN合并都困难的XML。关键词2:“测试工厂”。这时候把界面打开,连上中央服务器,让老板看试点项目的测试用例。“坐在办公室就能知道所有项目的测试进展情况。”这句话是杀手锏。老板们一定会喜欢,而且会帮你推广这个工具。只要被推广到更多的项目组,你就会变成红人。现在前面那些设计决策的重要性就逐渐体现了。因为测试用例不可重构,任何一个项目想要正经用你的工具都得找你帮忙做操作词汇,为此你就可以成立一个部门,拉更多的人来给你打这份苦工,自己当领导。但你又怕别人真的用得太多太频繁,那样的话你就得疲于支撑了。放心,因为RFT不稳定,因为每次执行都要连到中央服务器来取用例,因为不能通过命令行或者Ant之类的办法把它放进持续集成,还因为用鼠标拖拽就是比用键盘慢得多,自动化测试的进展会非常缓慢,你大可以安心享受自己的新办公室。先别急着享受,好事才刚开始呢。那些深思远虑的设计决策确保了很多项目不会认真用你的工具。这时候作为推行先进自动化测试理念的红人,你正好可以在老板耳边吹吹风,让他们强迫所有项目使用。强迫的方式有很多,但你必须记住的手段是给测试人员做职业技能鉴定考试:必须学会用你的工具才能评级加薪。这招的关键在于一箭双雕:不仅可以强迫他们使用,而且确保了他们没时间没动力去了解别的测试工具──你当然不想这些傻瓜突然冒出来说“这个开源的工具比我们自己的好用多了,而且还有那么多社区高手在维护和支持,为什么不用它”,对吧?强行推广之后,你接到的支撑需求肯定会剧增。这时你得好好培训一下客服的小弟。要让他们分清用户的来头。如果是老板重视的项目,如果办公室离你或者离老板很近,就得大力支持。如果来自什么边远山区的支撑需求,那就把它撂到一边凉快去吧。这些边远山区经常会提些奇怪的需求,例如“能不能不连中央服务器执行用例?我们这里无法连通公司内网”。让小弟们直接回复“不行”就可以了。无法连通公司内网的人同样无法有效地跟领导告状,不用担心他们。好了。现在你已经从一个边缘程序员成功晋升为公司的红人。不仅有一帮小弟鞍前马后,而且一大帮项目头头们都得求着你优先支撑。这快感,又岂是交付一两个项目、开一两次庆功会所能比拟的?恭喜你。你不仅改变了自己的命运,还很有可能改变整个公司的命运呢。噢,差点忘了最重要的,,,,千万别用你的测试工具来给自己的项目做自动化测试。微软那帮傻逼把这种行为叫做“吃自己的狗食”,可你做的是毒药,吃下去会害死自己的。切记,切记。
+ 加入我的果篮
末了还黑我大微软的dogfood...
引用 的话:末了还黑我大微软的dogfood...黑黑更健康
xml神吐槽……现在的确太多2B,喜欢把xml用到不合适的地方,搞的一切都僵硬死板、臃肿不堪……
引用 的话:xml神吐槽……现在的确太多2B,喜欢把xml用到不合适的地方,搞的一切都僵硬死板、臃肿不堪……连ant之父都说 当时选xml现在想想是个噩梦
空间信息与数字技术专业
在学 XML 的飘过,另外我们数据库 teacher 告诉我 存储按照条件对某种复杂数据处理的规则的时候也用 XML 可是我想不出,有什么别的办法。
空间信息与数字技术专业
用那些开源产品算了
无法连通公司内网的人同样无法有效地跟领导告状,不用担心他们。2333
引用 的话:在学 XML 的飘过,另外我们数据库 teacher 告诉我 存储按照条件对某种复杂数据处理的规则的时候也用 XML 可是我想不出,有什么别的办法。用xml描述数据没什么 but用它来描述逻辑就很麻烦 尤其在描述用户操作的时候
空间信息与数字技术专业
引用 的话:用xml描述数据没什么 but用它来描述逻辑就很麻烦 尤其在描述用户操作的时候问题是 逻辑性的内容需要被存储到数据库
神了!末了还不忘砍M$一刀
引用 的话:问题是 逻辑性的内容需要被存储到数据库逻辑性的东西就用逻辑性的东西来描述好了 非得让xml来做那就是没必要了 反正我们领导要是叫我这么做 我就会叫他写个循环里套着判断的ant脚本给我看看
引用 的话:逻辑性的东西就用逻辑性的东西来描述好了 非得让xml来做那就是没必要了反正我们领导要是叫我这么做 我就会叫他写个循环里套着判断的ant脚本给我看看+1我遇到的多数领导对这些东西都很厌烦(说明他们都还是靠谱的……)万一遇到这种神人,一般是置之不理,该怎么就怎么。如果他坚持,那么我们会反问:1、请说明不用XML有什么坏处?2、有哪些功能会因此而无法实现或者必须更多代码才能实现?3、是额外需要的实现代码多,还是管理xml的代码多?一般来说,这些神人是回答不上来这些问题的。但人家会胡侃,扯些“将来的业务”、“需求变更”之类不着边际的淡。于是继续问:4、将来的什么业务?5、什么样的需求变更?6、有多大可能?7、利用xml的什么机制来支持这些新业务、新变更?8、这种机制能否通过其它方式实现?9、总的来看,哪个更复杂?说白了,xml就是用来跨行业/跨领域交流的——说的更难听点,是给外行看的,这样双方协商数据格式,很容易就能找到一个基础的共同语言。但也仅此而已了,只有绝对的外行才会拿这玩意儿当宝。所以,对外公布的API之类场合(或者像开放文档格式这样希望达到“所有人都能看懂别人的数据”目标的东东)用一些,无可厚非(虽然通常也达不到预期目的……);但用在程序之内,扯自家内部交流的淡……那就纯属2B了。
引用 的话:+1我遇到的多数领导对这些东西都很厌烦(说明他们都还是靠谱的……)万一遇到这种神人,一般是置之不理,该怎么就怎么。如果他坚持,那么我们会反问:1、请说明不用XML有什么坏处?2、有哪些...点赞
从数据存储的角度来讲,xml就是一个层次型组织的、基本格式为key-value的数据的集合。所以,在很多nosql系统中(它们的最终存储格式也是key-value形式),数据的最终存储是可以做到和xml一一对应的。而在数据库中,可设计这样的表:id parentid key value轻易就能用它来实现xml所能提供的一切功能;而且这还充分利用了数据库本身的能力,可使用数据库api快捷、方便的访问甚至统计归类。到了特定的某种语言那里——比如以复杂、扯淡、功能弱著称的c++,它的stl标准库同样提供了map和unsorted_map(hash_map in c++11)容器去支持key-value格式数据。————————————————————————————————————而针对复杂逻辑,真正的大杀器是——lua之类无处不可嵌的动态语言。甚至在c中,都可以轻易的集成lua、python、php甚至lisp之类语言的解释器:还可能有比这些功能完备、设计优良、效率奇高的“小伙伴”更强大、更廉价、更可靠的选择吗?你甚至可以在运行时,从网络/键盘/磁盘文件/数据库/ocr识别或别的随便什么地方接受它们的代码,加载到内嵌解释器,执行。就这么简单。你也可以通过删除它们的io方面的支持库、或者给执行相关代码的宿主程序一个比较低的特权级、甚至直接修改它们的源代码,裁剪出一个安全子集,以规避安全风险。——当然,倒过来也行:比如我就搞过一个东东,用python写复杂但性能要求不高的主逻辑,而策略配置检查/估值之类需要动态配置、同时对速度又有苛刻要求的东西,就用c来搞——用python把配置翻译成c,然后再编译成动态库加载进来。这套可随意增加监控项目、更改配置公式、还有版本管理能力和参数类型检查能力的东西,也就不到2000行代码而已(其中超过50%还是注释)。——同样的,c中编译动态逻辑为c、c通过python/yacc编译动态逻辑为c、c调用函数式语言编译器,……都是简单、可行的。有清清爽爽的lua、python、lisp不用,偏要去写几千几万甚至几十万行代码,硬生生的凑出一个简陋、缓慢、怪异、充满bug、无法扩展、不可维护的逻辑解析器,去解析复杂、庞大、不可维护、没有可读性的、用xml表示的怪异文本——这算有病呢,还是有病?
勘查技术与工程专业,编程爱好者
引用 的话:有清清爽爽的lua、python、lisp不用,偏要去写几千几万甚至几十万行代码,硬生生的凑出一个简陋、缓慢、怪异、充满bug、无法扩展、不可维护的逻辑解析器,去解析复杂、庞大、不可维护、没有可读性的、用xml表示的怪异文本——这算有病呢,还是有病?这样在维护的时候就可以放心把任务向下指派而自己可以安静享受好时光了
1:最少3年前,我看过这篇贴子。2:第一次看见是在华为内部论坛上。3:3年前的华为在主推『持续集成』『敏捷开发』。GT3000、GTR、AW 等自动化测试工具。4:我有理由相信这是华为人吐槽华为内部现状(当年的"现状")的文章。描述的情况与当时华为内部是一样一样的。5:我是猜测的,对以上言论不负责。
引用 的话::最少3年前,我看过这篇贴子。2:第一次看见是在华为内部论坛上。3:3年前的华为在主推『持续集成』『敏捷开发』。GT3000、GTR、AW 等自动化测试工具。4:我有理由相信这是华为人吐...我也是看到某华为人的博客里写的
引用 的话:我也是看到某华为人的博客里写的当年我们用的RFT,确实是 hack 了 ibm 的。licence只有一个,远远超出了许可证数量。(仅限我当时所在部门)GT3000是用例库,GTR 是自动化运行工具,AW 是编写脚本。后来整合到 GT3K 中。而 GT3000就是一个所谓的『云用例库』,所有用例都是在主服务器上,而 GTR 使用的是 TCL 语言。 AW 就是 xml当时一个测试人员最多每天可以跑3000个用例。点个 run,自己跑自己的。而这种大规模的『用例重用』的行为,貌似只有在『华为』这种地方出现。因为计费系统基本上都是继承自上个版本。比如我做过的印尼版本、上海版本、拉美版本、基本上都是一个版本一个版本继承过来的,用例基本都可以重用。从『边缘山区的支撑请求』,可以看出来,此公司肯定不只一个办公地点。而华为当时在全球都有局点,比如我所在项目组有伊拉克、印度、印尼等。放眼全中国,业务能做这么远的,似乎只有华为一家。所以我斗胆预测这是『华为人吐槽华为的自动化工程』。
引用 的话:我也是看到某华为人的博客里写的引用 的话:我也是看到某华为人的博客里写的另外我甚至能猜到这篇贴子吐槽的是谁。那个家伙名声很大(在华为内部),但是脾气也很大,与名声一样大。技术确实牛,但是人很藏私,不告诉你就是不说。吃过两次饭,不是太喜欢他的为人。
引用 的话:另外我甚至能猜到这篇贴子吐槽的是谁。那个家伙名声很大(在华为内部),但是脾气也很大,与名声一样大。技术确实牛,但是人很藏私,不告诉你就是不说。吃过两次饭,不是太喜欢他的为人。哦 看来是知道内幕的人啊 个人也很讨厌藏私的
引用 的话:当年我们用的RFT,确实是 hack 了 ibm 的。licence只有一个,远远超出了许可证数量。(仅限我当时所在部门)GT3000是用例库,GTR 是自动化运行工具,AW 是编写脚本。后来整...其实08年我在某对日外包公司也想这么搞的 不过是基于开源的 还没搞起来就不得不离职了
cobol的测试没有和用户互动的bash
用例重复使用率也挺高的 好多程序的测试只是需要改一下输入数据覆盖一下边界条件而已 也算是初级的持续化集成+自动测试了吧
这里主要就对比一下UFT(QTP和TW(TestWriter)的异同,也是希望抛砖引玉,求各位大神指教 1.相同点 1.1 支持录制和回放的功能 1.2 录制的时候通过页面元素和对象进行捕捉 1.3 操作界面都很直观、简介 2. 不同点 2.1 QTP只能实现windows,TW可以跨Web、Android、iOS三大平台 2.2 QTP无法进行测试项目和人员的分配管理,TW项目管理划分清晰,易管理 2.3 QTP 执行失败结果不清晰,TW失败截图,易跟踪问题 2.4 QTP要创建增强脚本,TW可以实现0脚本 2.5 QTP维护起来花时间,TW可以节省时间 通过以上简单对比,个人觉得,没有自动化测试基础的菜鸟们,可以和我一样,先研究TW,这样可以快速入门,也可以树立自己的信心。在这之后,自己可以再研究像UFT(QTP)、LR这种需要脚本进行维护的自动化工具,循序渐进,也更便于自己能力的提高。
(C)2017果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:

我要回帖

更多关于 国内做自动化测试公司 的文章

 

随机推荐