我正在征求测试工程师和 iOS 开发人员对特定问题的意见。
我已经使用 Appium 一年多了,在真实设备上运行移动网络测试时遇到了各种困难。每次 Apple 对 XCTest 或 Safari 进行更改时,Appium 都会受到直接影响(即使他们修复了一些东西,也会出现其他问题),并且已经到了我花更多时间解决 Appium 相关问题的地步与来自 AUT 的那些相反。
此外,您无论如何都需要一台 Apple 计算机来开发和执行 Appium iOS 测试。所以我想为什么不直接使用 XCTest 来使用 Swift 或 XCTest 支持的任何语言编写测试?
我非常感谢有 Appium 和 XCTest(Swift 等)自动化测试经验的人提出的评论和意见。
与 XCTest 相比,使用 Appium 自动化 iOS 原生和 Web 应用程序测试有哪些优势?
最佳答案
正如您已经发现的那样,Appium 的最大缺点之一是它是第三方框架,每次 Apple 发布 Xcode 时它都会崩溃。这不太可能改变,因为 Apple 现在维护着自己的 UI 测试框架。
使用 Appium 还有其他一些优势 - 您可以从多种语言(Java、Ruby、Python、C#...)中进行选择,这使得任何能够使用其中一种非常流行的语言进行编程的人都可以使用它,可以想象,您可以在 iOS 和 Android 上的同一应用程序的测试之间共享代码。
根据我的经验,虽然有很多人在使用 Appium,但社区支持水平并不能弥补令人失望的维护水平;除了 Appium 与 Xcode 兼容性的脆弱性之外,我发现一些关键功能在某些绑定(bind)中仍未实现,例如在 Python 中滚动。
对于 UI 测试,可靠性是框架最重要的方面。没有可靠性,您就不能信任测试来标记问题,没有信任,您的测试对您和您的团队几乎没有值(value)。这就是我推荐 XCTest 而不是任何第三方框架的原因。
使用 XCTest,您永远不必担心无法更新您的 Xcode 版本,并且框架会按照 Apple 的发布标准进行维护。与所有 iOS UI 测试框架一样,存在一些错误(特别是围绕选择器),但我发现框架的稳定性和它归 Apple 所有的事实胜过了奇怪错误的缺点。
获得 Apple 的认可是使用 XCTest 的重要优势,因为 Apple 可以删除对 Appium 所依赖的 API 的访问权限,而 Appium 可能会在一夜之间永远停止工作。从历史上看,Apple 不会在至少提前一年通知的情况下简单地取消对自己框架的支持。
直接使用XCTest需要使用Swift(推荐)或者Objective-C。没有 Appium 提供的语言选择那么多,但是对两种语言的支持是一致的,因为它们都使用相同的实现。 Swift 是一种强有力的语言选择,尤其是对于大型项目而言,因为它的类型安全性允许您在运行前注意到许多编程错误。这两种语言还在 Xcode 中为您提供强大的 intellisense(自动完成)支持,这是 Python 或 Ruby 等“动态”语言不提供的开箱即用的功能。
随着有关将 XCTest 用于 UI 测试的信息越来越多,并且越来越多的人认为能够采用它,围绕 XCTest 的社区正在壮大。用于 UI 测试的框架的许多部分多年来一直用于单元测试,因此在添加 UI 测试支持之前,在许多方面,已经有大量关于使用它的信息可用。
这两个框架使用相似的概念 - XCUIApplication 类似于 Appium 的驱动程序,它使您可以访问屏幕上的内容。这两个框架提供的功能级别可以说非常相似,因此这取决于您的优先级 - 可靠性 (XCTest) 或跨其他平台的可重用性和语言可访问性 (Appium)。
关于iOS 自动化测试 - XCTest 与 Appium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46044804/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下