Xamarin Live Player…第2卷

由于缺少SDK和错误的版本组合而陷入困境之后,我面对了不可避免的事实,并…更新了我的所有系统。 首先要做的是将macOS升级到10.12。 那就是我每年在WWDC之前每周要做的事😀 然后,我获取了最新的Xcode版本8.3.2。 三回!!!十一十一。 为什么? 首先,Mac在下载过程中进入睡眠状态。 唤醒他后,下载重新开始。 该死的。 然后,我犯了一个大错误,即同时启动了几个其他应用程序更新。 结果-我什至无法解释为什么会发生-重新开始Xcode下载。 因此,我不再在Mac App Store中更改关注重点,而是让Xcode安静地下载和安装。 最后,Xcode 8.3.2安装在我的系统上,内部装有iOS 10.3。 是的 我非常热心地实现了我的主要目标:Xamarin Live Player入门。 因此,我打开了Mac专用的Visual Studio,但仍在Alpha通道上以获得Live Player支持。 然后选择我手机上的Live Player,让我的应用运行。 建立连接非常快,“ Connected”一词的绿色字体非常令人放心。 但是失望很快就过去了。 同样,发生了Vizualization错误。 所以什么都没有改变。 Nooooez。 嗯……我确保已更新所有最新的软件版本和设备。 现在缺少了什么? 所以我想:问问那个在// build大会上展示了这款出色软件的人-James Montemagno。 而且他提供了很多有用的信息,回复速度非常快。 为此非常感谢! 但是,消息令人非常悲哀:该实时播放器目前尚不支持情节提要,而是专注于具有编码iOS UI的Xamarin Forms应用。 这就是我遇到问题的原因。 我试图在Live Player上运行Xamarin.iOS应用而不是Forms应用。 从我的角度来看,这个决定朝着错误的方向发展,因为故事板是iOS上的东西。 是的,很多人不会同意也不喜欢他们,仍然会非常虔诚地用代码编写用户界面。 但是您不应该-或更好地,您不应该。 但这是另一个讨论的话题😀 因此,让我们等待Xamarin Live Player的进一步开发。 到那时,我将使用Forms应用程序尝试整个过程。 敬请关注!

录音— RubyMotion

最初于 2014年8月5日 发布在 polyglotconsultant.blogspot.com 上。 AVAudioRecorder类在我们的应用程序中提供了录音功能。 它记录通过内置麦克风或连接的耳机传来的音频。 我们可以录制音频,直到用户停止录制为止。 记录给定的时间,也可以暂停和记录。 我们可以实现委托方法来处理录音机中断,音频解码错误和录音完成。 initWithURL()用于初始化AVAudioRecorder类的对象。 这将接受文件的URL,设置哈希值和错误指针以存储错误代码(如果在对象初始化期间全部引发错误代码)。 网址: 这将保存要记录的文件系统位置。 从文件扩展名开始,它将采用录制格式。 recording_url = NSURL.fileURLWithPath(App.documents_path +“ /record.caf”) 设置: 这将具有记录所需的配置,例如采样率,比特率,比特深度和转换质量。 使用AV Foundation音频设置常量中描述的设置键。 configs = {AVFormatIDKey => KAudioFormatLinearPCM,AVNumberOfChannelsKey => 2,AVEncoderBitRateKey => 16,AVEncoderAudioQualityKey => AVAudioQualityMax.to_i,AVSampleRateKey => 44100,AVLinearPCMIsBigEndianKey => 0,AVLinearPCMIsFloatKey => 0 错误: 这是指向NSError的指针。 那将参考错误描述。 err_ptr = Pointer.new(:object) 录音机初始化示例如下 @recorder = AVAudioRecorder.alloc.initWithURL recording_url,设置:配置,错误:err_ptr 录制之前,必须将AVAudioSession设置为录制。 错误= Pointer.new(:object)#配置音频会话sessionInstance […]

React Native是否已取代Native?

作为iOS开发人员,我很快就判断出React Native,并认为这是构建移动应用程序的另一种次等且基本的方法。 我认为,显然,如果应用程序是用JavaScript编写的,则不会感到原生,但我所忽略的东西已成为迄今为止最先进的跨移动解决方案。 可以猜到,当React Native发布并受到大量炒作时,我希望平台会很快消失。 我可能只是担心自己的工作安全性,因为JavaScript程序员现在能够开发本机应用程序,但是我认为问题更加严重了。 我担心这会导致一波不太自然或自然的应用程序浪潮。 在使用该平台玩了将近一年之后,我开始喜欢它的开发模式,大多数样式技术,甚至用代码编写视图。 这就提出了一个问题,React Native是否取代了本地移动开发? UIKit最近为我做了什么? 当iOS在2008年开设App Store时,它便将开发解锁到了一个我们从未见过的世界。 但是随着岁月的流逝,Objective-C和iOS开发模式开始显示出自己的时代。 Auto-layout和MVC是主要的iOS开发模式,通常会吸引开发人员来创建大量的,充满错误的ViewController文件。 当然,用Objective-C编写将应用程序锁定在iOS平台上,并且随着Android用户迅速超过iPhone用户,这成为了一个巨大的痛点。 React和React Native本质上具有一种开发模式。 通过组件的单向数据流。 需要几个示例项目来采用,但是它从根本上改变了我们构建视图的方式。 现在,我们可以根据其输入来推断视图的外观,因为这些组件具有功能性和确定性。 除了巩固新的移动开发模式外,React Native还将移动开发与大型JavaScript社区联系在一起。 为了管理依赖关系,我们现在有NPM。 对于更多功能性的数组操作,我们现在有ES6和lodash。 可靠的开源JS项目列表远远超过了Objective-C的开源社区,现在移动开发人员可以利用它。 本机开发具有如此缓慢的开发迭代。 要在应用程序的配置文件页面上更改像颜色一样简单的内容,您需要重新编译,运行,导航到屏幕,最后验证更改。 React Native仅需构建一次应用程序,然后每次进行更改便重新加载JavaScript,从而彻底改变了工作流程。 无需等待编译。 此外,React Native还包括热模块重载,这使开发人员可以保存文件并立即查看视觉和逻辑更改,而无需重置应用程序的状态,并且要求开发人员手动浏览应用程序以验证状态。 这些是未来的工具。 (我什至没有时间进行Redux和时间旅行调试) 好吧,有什么坏消息? 是什么阻止每个人都在React Native中编写每个新应用? 首先,尽管Facebook和React Native的开源团队在与Apple和Android设备API(例如,推送通知,手势,摄像头等)实现可靠接口方面做得很出色,但许多API仍未完成。 如果您对应用程序的想法需要音频,视频,麦克风,蓝牙或地理位置,那么您将需要依靠第三方解决方案或在Objective-C和Java中实现该功能以及创建接口。 接下来,由于React Native仍在成熟,对该软件包的更新通常会有重大更改,并且需要大量重构。 您可能会问:“为什么不坚持使用您开始使用的版本?”好吧,如果Facebook发布了您需要的新界面,或者您真正想要的第三方程序包需要的版本比您需要的版本新,那么可能是该死的时候了并按照Facebook的指南升级React Native。 当涉及到移动开发,尤其是iOS时,导航是用户体验的重要组成部分。 令我惊讶的是,发现React Native的Navigator实际上比原生iOS或Android更具挑战性。 这是React Native社区中的一个已知痛点。 Facebook正在转向另一个名为NavigationExperimental的导航组件,该组件似乎已经解决了围绕Navigator的许多问题。 使用这种组件名称,您的CTO在审查您的下一个请求时会说什么? 使用React Native之前要问的问题 您的用户是否希望该应用程序反映其移动操作系统的独特设计准则(例如,人机界面准则,材料设计)? […]

ioscon 2017 —构建适用于iOS,macOS和tvOS的应用程序

今年,我有机会在ioscon 2017上发表了有关Equinux如何为Apple的三个主要平台构建应用程序的演讲。 在多个平台上运输产品会增加额外的开销和工作量,而采用正确的方法和工作流程可以将这两者保持在最低水平。 我们的开发人员在构建适用于iOS和macOS的应用程序方面拥有丰富的经验,他们能够将其应用于tvOS。 我分享了一些经验教训,以及有关如何确定多平台是否适合您的产品以及如何考虑跨多个平台的产品设计的一些技巧。 前往Skills Matter观看完整的谈话 关于ioscon的说明 这是我在ioscon的第一年,我非常兴奋。 演讲真的很好,并且深入探讨了我在其他地方没有看到的主题。 您会感到所有与会者都真正了解他们的知识,并且在大多数会议之后我们进行了一些精彩的交谈。 推荐 !

什么是Cydia越狱?

关于Cydia越狱的一切 目前,大多数iDevice用户对iDevice市场上可用的Cydia和越狱工具感到兴奋。 两种工具均有助于获取和处理智能iDevice的有用过程。 Cydia Jailbreak没有一个复杂的过程,它可以使一流的移动设备获得最终用户而不会造成任何混乱。 在这里,我们想提供有关Cydia越狱的所有信息。 希望这些精彩的内容能够帮助您解决iDevice上的所有问题,而不会出现任何问题,并且最好每天更新Cydia和越狱信息。 什么是越狱和Cydia? 在考虑这两种方法时,这并不是一个艰难的过程,这意味着您可以通过受信任的工具完成此过程。 与Android植根相比,越狱的过程与Android植根的过程类似,后者可以消除Apple Inc默认对iDevice施加的所有障碍。 有了这些限制,由于必须选择与iOS版本兼容的最佳越狱工具,因此无法在设备上使用第三方服务。 越狱了iDevice之后,您可以通过Cydia App Store使用任何第三方服务访问您的智能iDevice。 Cydia是越狱过程的输出,也可以替代App Store。 现在,您具有有关Cydia Jailbreak的主要思想,可以开始使用iDevice应用程序。 Cydia的重要性 Cydia是一个很棒的应用程序商店,也被称为独立的第三方应用程序安装程序。 这是杰伊·弗里曼(Jay Freeman)推出的Apple应用商店的最佳替代品。 它由扩展程序,主题,应用程序,调整项等组成,无需支付任何费用即可使用。 作为iDevice用户,您必须越狱iOS设备才能安装Cydia,它也可以按照您的方式自定义智能iDevice。 如果没有越狱设备,您将没有机会体验Cydia最好的越狱 。 重要的是要使用适当的越狱工具越狱设备来访问Cydia应用商店。 关于Cydia越狱的最新更新 苹果公司在全球享有盛誉,它们已经向公众发布了许多iOS版本,其中包括各种功能。 最近,他们已经向公众发布了最新的iOS 12版本,其中包括令人惊叹的功能。 大多数iDevice用户都必须等待使用此出色的操作系统,而且最好的事情是一些开发人员现在已向iDevice社区发布了越狱更新。 阿里巴巴Pandora实验室和Cool Star开发人员已经被证明适用于iOS 12版本的不受限制的越狱工具。 我认为这是一篇很棒的文章,他们正在使用iOS 12最新版本。 希望本快速指南将帮助您解决iDevice上的许多问题,并能提供有关Cydia越狱的最佳信息。 由于某些越狱工具,请提防将Cydia下载到您的设备上,因为它们会自动安装Cydia,而有些则没有。 通过参考本完整指南,您可以获得设备的增强性能。

如何选择合适的iOS体系结构(第2部分)

MVC,MVP,MVVM,VIPER或VIP 您可以在这里查阅第一部分。 主要的iOS架构 简要概述。 MVC MVC层如下: M:业务逻辑,网络层和数据访问层 V:UI层(UIKit内容,情节提要,Xibs) C:在模型和视图之间协调中介。 要了解MVC,我们必须了解它的发明背景。 MVC是在旧的Web开发时代发明的,当时Views没有状态。 在过去,每次需要在网站上进行视觉更改时,浏览器都会重新加载整个HTML。 当时还没有维护和保存视图状态的概念。 例如,有些开发人员将同一个HTML文件,PHP和数据库访问混合在一起。 因此,MVC的主要动机是将View层与Model层分开。 这增加了模型层的可测试性。 在MVC中,视图和模型层应该彼此一无所知。 为了使之成为可能,发明了一个名为Controller的中间层。 这就是所应用的SRP。 MVC周期的一个示例: 触发了View层中的用户操作/事件(例如:Refresh Action),并将该操作传达给Controller 向数据层询问数据的控制器 建模返回到控制器的数据 管制员说,使用新数据为View更新他的状态 查看更新他的状态 苹果MVC 在iOS中,视图控制器耦合到UIKit和生命周期视图,因此它不是纯MVC。 但是,在MVC定义中,没有什么可以说Controller不知道特定于View或Model的实现。 他的主要目的是将Model层与View层的职责分开,以便我们可以重用它并单独测试Model层。 ViewController包含视图并拥有模型。 问题是我们曾经在ViewController中编写控制器代码以及视图代码。 MVC通常会产生一个称为Massive View Controller的问题,但这只会发生,并且在具有足够复杂性的应用程序中会成为一件严重的事情。 开发人员可以使用一些方法来使View Controller更易于管理。 一些例子: 使用委托设计模式为其他类(如表视图方法数据源)提取VC逻辑,为其他文件提取VC逻辑。 通过组合创建更加明确的职责分离(例如,将VC拆分为子视图控制器)。 使用协调器设计模式来消除在VC中实现导航逻辑的责任 使用DataPresenter包装器类,该包装器类封装逻辑并将数据模型转换为表示呈现给最终用户的数据的数据输出。 MVC与MVP MVC是向前迈出的一步,但它仍然以某些事情的缺席或沉默为标志 。 同时,万维网发展壮大,开发人员社区中的许多事物也在发展。 举例来说,程序员开始使用Ajax,只加载部分页面,而不是一次加载整个HTML页面。 在MVC中,我认为没有任何迹象表明Controller不应该了解View(不存在)的具体实现。 HTML是View层的一部分,很多情况下都是愚蠢的。 在某些情况下,它仅接收来自用户的事件并显示GUI的可视内容。 随着网页的各个部分开始被装入各个部分,这种细分导致保持View状态的方向以及对表示逻辑职责分离的更大需求。 表示逻辑是控制应如何显示UI以及UI元素如何交互的逻辑。 一个示例是控制逻辑,该逻辑在什么时候加载指示器应开始显示/动画以及何时应停止显示/动画。 在MVP和MVVM中,视图层应该是愚蠢的,没有任何逻辑或智能,在iOS中,视图控制器应该是视图层的一部分。 View愚蠢的事实意味着即使表示逻辑也不在View层之内。 […]

Windows上的Unity iOS:使用VMWare从Windows机器上的Unity编辑器中部署到iPhone

这是在Windows计算机上开发Unity iOS应用程序的帮助。 使用VMWare,可以在本地虚拟机上运行Shell脚本,以自动完成通过USB将Unity应用程序从编辑器部署到iPhone的整个过程。 该过程是单击等待的过程,每个构建大约需要5分钟。 本文提出了一些组件来管理自动化。 注意 :这是“穷人”的方法,如果您一开始只能购买Macbook,从长远来看可能会浪费您的资源。 另外,在完全提交之前,请通读并做您自己的研究,因为可能存在一些硬件要求。 免责声明 :在非Apple硬件上运行任何macOS均违反Apple EULA。 请确认风险,并自行承担责任。 系统总览 Shell脚本在Windows和VM macOS都具有读/写访问权限的目录中监视非常简单的时间戳文件。 每当Unity Editor将项目组合到文件夹中时,C#后处理脚本都会在文件中设置标志。 然后在VM中,shell脚本将检测该标志,构建/部署项目并折叠该标志。 因此,只要脚本在VM上运行,用户就可以在Unity Editor中按下“构建”按钮,并免提等待,直到iPhone自动打开应用程序。 设置共享文件夹 共享文件夹是VMWare用来访问主机文件系统的功能。 该文件夹将容纳并启用Unity Editor和Shell脚本之间的通信。 使用共享文件夹 https://www.vmware.com/support/ws5/doc/ws_running_shared_folders.html 设置xcodebuild 要通过shell脚本构建XCode项目,有一个名为xcodebuild的命令行工具。 这应该与XCode应用捆绑在一起。 设置ios部署 xcodebuild没有可以部署到设备上的功能,但是还有另一个名为ios-deploy工具可以这样做。 此外,iPhone还需要通过USB连接到计算机并路由到VM。 ios部署 https://github.com/ios-control/ios-deploy 连接USB设备 https://www.vmware.com/support/ws55/doc/ws_devices_usb_connect.html 设置Unity C#后处理脚本 构建完成后,将调用带有[PostProcessBuild]属性标记的静态方法。 对于时间戳文件的格式,脚本可以是这样的: 每当用户单击“生成”按钮时,Unity编辑器都会将项目编译为XCode项目,然后此脚本将更新时间戳。 构建路径必须设置为共享文件夹内部。 设置Shell脚本 这是整个脚本,随后是一些重要内容的深入介绍。 该脚本可以设置为登录项,以便它自动开始运行。 可以通过关闭终端窗口来中止该过程。 在脚本中可以更改的共享文件夹名为__transfer_ ,以及项目名称( MyProject )和应用程序名称( foo.app )。 这些名称必须与Unity Editor中的构建设置匹配。 默认情况下,诸如cd和cp类的命令无法在“共享文件夹”(“无此文件或目录”)内部访问。 […]

我与React-Native关系的3个原因

我担任iOS开发人员已有一段时间了,以前的大部分文章都涉及到iOS平台的各个方面。 但是,我必须承认一些事情……我一直在与React-Native发生婚外情,甚至“更糟”的事情-我对此感到非常好。 如果您不知道什么是React-Native,则应访问React-Native网站。 React Native可让您仅使用JavaScript构建移动应用程序。 它使用与React相同的设计,使您可以从声明性组件组成丰富的移动UI。 让我告诉您有关我与React-Native关系的三个原因。 生态系统 当我有机会为项目开发Web面板时,我第一次被介绍给React。 看到事情如何在网络上运行并了解有关Redux之类的架构的更多信息,真是很有趣。 当我发现React + Redux的知识可以轻松地通过React-Native转移到移动开发中时,我感到非常高兴。 如果情况需要,这可以使您将技能应用到项目的各个部分。 我并不是说您将像在特定平台上的“专家”一样有效,但是您可以肯定地帮助您的队友并为项目增加价值。 反馈回路 如果您是TDD / BDD的忠实拥护者,或者只是觉得需要测试编写良好的代码,那么您可能会知道,使用这种方法可以使反馈周期短是真正的好处。 我喜欢我可以在每个文件保存上运行测试的事实,知道结果只需几秒钟。 这使我感到自己使用的工具适合我的工作风格,并可以帮助我以自己喜欢的方式编写代码。 富有成效 来自一个不小的iOS项目,我习惯了很长的构建时间,事实是,有时甚至切换到测试目标都需要我重新构建项目。 我参与的React / React-Native项目虽然规模不大,但是仍然…事实上,您可以看到由于热重装而立即发生的变化,而您唯一需要等待的就是Typescript编译器,这极大地提高了生产率。 摘要 我真的很喜欢React / React-Native适合我的工作方式的方式。 这些很棒的工具肯定会帮助您完成工作。 我必须说,对于RN允许您在平台之间重用大部分代码这一事实,我并没有那么炒作。 当然这是一件很棒的事情,我当然不会放弃,但是我真正喜欢RN的一件事是我从中使用它构建事物以及使用开发人员创建RN附带的工具的方式获得乐趣。心里。 这并不是要把一切都留给React-Native。 学习任何新的框架或语言将有助于您了解自己喜欢的内容,并与各种平台上使用的模式取得联系。 也许它将激发您找到改善其他项目工作流程的新方法。 不要将您的心爱的语言或框架附加到自己的头上,并时不时尝试其他方法-作为开发人员,它肯定会使您受益。 您可以在 www.eliaszsawicki.com的 博客上找到更多我的帖子。

15toGO正在寻找可以为我们的技术团队加油的下一个团队成员

我们知道挑战是可以帮助我们成长的真正动力。 这就是为什么我们欢迎那些愿意从事需要创新,决心和独特方法来解决尚未解决的问题的人员的人。 如果您发现自己正在研究可以改变旅游行业并为团队带来知识的解决方案,我们将非常乐意与您聊天和喝啤酒。 关于该项目 15toGO是一个平台,它将使旅行者能够与志同道合的人相遇,预订由当地旅行社组织的旅行,并帮助人们前所未有地一起旅行。 我们正在构建的应用程序具有反向用户体验,有可能吸引数百万用户-与其选择先去哪儿,不如让网络参与者首先建立志同道合的人组成的社区,他们可以与他们一起旅行! 我们所知道的分散式应用程序可能会破坏旅游业。 了解有关该项目的更多信息。 质量检查专员 我们即将发布我们应用程序的Alpha版本,我们正在寻找有动力的质量检查人员,他们希望成为不可思议的专业团队的一员。 职责范围 –为不同的项目创建测试用例 –执行不同类型的黑盒测试,包括功能性和非功能性 –监视,跟踪和报告在测试执行过程中发现的缺陷 –跟踪开发人员更改并在需要时进行适当的测试 –使用各种工具和语言自动化测试用例 –为新的应用程序或功能开发和组织测试策略和测试用例 –通过确保我们的软件没有错误,使我们的客户获得最佳体验 要求 – 3年以上软件质量保证经验 –超过1年的自动测试经验 –对SDLC有很好的了解 –流利的英语,书面和口语 –热心,勤奋,有上进心的人,具有出色的沟通能力 –井井有条地组织工作 –承担责任并能够做出独立的决定 – ISTQB认证将是一个加号 毫不犹豫地申请该职位-每个申请都会得到认真调查。 我们提供: —令人满意的薪水 -远程工作的机会 – 灵活的工作时间 —令牌奖励,可用于预订平台上的旅行 —与超级巨星团队合作的机会 iOS开发 我们正在寻找一个技能娴熟,热情高涨的iOS开发人员,他们可以立即加入我们,并帮助我们提供旅行者所期望的最佳用户体验。 职责范围 –在快节奏的工程团队中工作,并帮助推动团队的交付和技术能力前进 –与项目负责人合作,以确保团队提供所需的质量并遵守最佳实践 –积极主动地参与所有任务,并处理冲刺积压项目 –寻找并积极向团队推广想法和技术 –负责从初始设计到交付到生产的任务交付 –了解更改将对负载和性能产生的影响 要求 –经过验证的iOS开发专业经验 –成功交付复杂,高性能和高质量软件的经验 –了解非功能性要求,质量保证和持续改进方法 –精通iOS原生技术(Objective-C,Swift,CocoaTouch,Xcode,Instruments) – REST-API集成经验 –对AutoLayout的深刻理解 –具有编写自定义UI组件和库的经验 […]

构建本机移动用户界面

移动工程师Tony Nguyen的问答 当您首次加入Personal Capital时,有关移动开发的最大惊喜是什么? 在以前的职位上,我的同事和雇主使用“所见即所得”(WYSIWYG)编辑器来构建其移动应用程序的用户界面。 这意味着使用用于Xcode(iOS)的界面生成器和用于Android的布局编辑器。 但是在Personal Capital,我们通过代码构建UI。 为什么Personal Capital移动工程选择不使用所见即所得编辑器? 最大的原因是性能。 在将XIB文件和情节提要加载,解析和转换为代码时,编译器必须处理更多的开销。 这会产生不必要的工作。 在大型项目中,这可能会对性能(例如应用程序启动)产生重大影响。 移动应用程序的初始应用程序启动至关重要,因为它会影响用户是否使用您的应用程序以及使用该应用程序的时间。 另一个原因是可重用性。 在代码中构建UI可以让我们通过继承重用UI组件。 例如,单个应用程序中的大多数UI组件具有相同的样式。 代替重复创建UI组件,我们可以使用基本的UI类,该类包含我们想要的所有属性,并仅实例化该对象。 任何小的偏差,我们都可以简单地从基数开始扩展并相应地进行更改。 通过从代码编写UI,我们可以使代码保持DRY(不要重复自己),并使代码更加一致。 以编程方式创建UI的学习曲线如何? 最难的部分是新员工需要大量增加。 没有关于界面外观的即时反馈。 我发现缺少即时反馈确实迫使我理解并思考为什么以及在哪里需要放置UI元素。 如果您多加考虑,有时可以简化复杂的UI布局! 对于那些习惯使用所见即所得编辑器的开发人员来说,学习曲线有些陡峭。 但是,我们认为以编程方式创建UI有利于开发人员的成长。 您真的很了解以编程方式完成的工作—尤其是视图生命周期可能变得多么复杂和令人困惑! 但是,一旦克服了学习曲线,就会发现您对应用程序中发生的事情有了更好的控制。 与使用WYSIWYG编辑器构建的iOS UI相比,编码的iOS UI更易于测试吗? 我们发现,以编程方式构建UI时,与通过WYSIWYG编辑器相比,UI测试更为简单,因为在编程视图中强制分离了责任。 好的做法是不要将业务逻辑与构建UI混合使用。 这使我们更容易测试。 我们使用Xcode的XCTest框架编写测试-如果您对我们的贡献感兴趣,我们正在招聘!