通过测试驱动开发来开发图书馆的功能

通过测试驱动开发来开发图书馆的功能

现在,我们将逻辑提取到src/lib.rs中,并将参数收集和错误处理留在src/main.rs中,为代码的核心功能编写测试要容易得多。我们可以直接使用各种参数调用函数,并检查返回值,而不必从命令行调用二进制文件。您可以自己编写Config::new和run功能的一些测试。
在本节中,我们将minigrep使用测试驱动的开发(TDD)流程将搜索逻辑添加到程序中。此软件开发技术遵循以下步骤:
此过程只是编写软件的许多方法之一,但是TDD也可以帮助驱动代码设计。在编写使测试通过的代码之前编写测试,有助于在整个过程中保持较高的测试覆盖率。
我们将测试驱动该功能的实现,该功能实际上将在文件内容中搜索查询字符串并生成与查询匹配的行列表。我们将在名为的函数中添加此功能search。
因为我们不需要他们了,让我们删除println!从报表的src/lib.rs和SRC/main.rs我们用来检查程序的行为。然后,在src/lib.rs中,我们将添加一个tests带有测试功能的模块,就像在第11章中所做的那样。测试函数指定我们希望search函数具有的行为:它将接受一个查询,并在其中搜索查询的文本,并且它将仅返回包含查询的文本中的行。清单12-15显示了该测试,该测试尚未编译。
文件名:src/lib.rs
清单12-15:为search我们希望拥有的功能创建失败的测试
此测试搜索字符串”duct”。我们正在搜索的文本为三行,其中只有一行包含”duct”。我们断言从search函数返回的值仅包含我们期望的行。
我们无法运行该测试并看到它失败,因为该测试甚至无法编译:该search功能尚不存在!因此,现在我们通过添加search始终返回一个空向量的函数的定义,来添加足够的代码以使测试得以编译并运行,如清单12-16所示。然后测试应该编译并失败,因为空向量与包含该行的向量不匹配”safe,fast,productive.”
文件名:src/lib.rs
清单12-16:定义了足够的search功能,以便我们的测试可以编译
注意,我们需要’a在签名中定义的显式生存期,search并与contents参数和返回值一起使用。在第10章中,生命周期参数指定了将哪个参数生命周期连接到返回值的生命周期。在这种情况下,我们指示返回的向量应包含引用参数切片contents(而不是参数query)的字符串切片。
换句话说,我们告诉Rust,search只要search在contents参数中传递到函数中的数据,函数返回的数据就会存在。这个很重要!引用的数据由一个切片需要是有效的基准是有效的;如果编译器假定我们正在制作query而不是的字符串切片contents,它将错误地进行安全检查。
如果我们忘记了生命周期批注并尝试编译此函数,则会收到此错误:
Rust无法知道我们需要两个参数中的哪一个,因此我们需要告诉它。因为contents是包含所有文本的参数,并且我们想返回该文本中匹配的部分,所以我们知道contents应该使用生命周期语法将其连接到返回值。
其他编程语言不需要您连接参数以在签名中返回值。尽管这看起来很奇怪,但随着时间的推移它将变得更加容易。您可能需要将此示例与第10章中的“使用生命周期验证引用”部分进行比较。
现在让我们运行测试:
太好了,测试失败了,完全符合我们的预期。让测试通过!
目前,我们的测试失败了,因为我们总是返回一个空向量。要解决此问题并实施search,我们的程序需要遵循以下步骤:
让我们完成每个步骤,从遍历行开始。
Rust有一个有用的方法来处理字符串的逐行迭代,方便地命名为lines,如清单12-17所示。请注意,这尚未编译。
文件名:src/lib.rs
清单12-17:遍历其中的每一行contents
该lines方法返回一个迭代器。我们将在第13章中深入讨论迭代器,但回想一下您在清单3-5中看到了使用迭代器的这种方式,其中我们使用了for带有迭代器的循环来对集合中的每个项目运行一些代码。
接下来,我们将检查当前行是否包含查询字符串。幸运的是,字符串有一个有用的名为的方法contains,可以为我们做到这一点!contains在search函数中添加对方法的调用,如清单12-18所示。请注意,这仍然不会编译。
文件名:src/lib.rs
清单12-18:添加功能以查看行中是否包含字符串query
我们还需要一种方法来存储包含查询字符串的行。为此,我们可以在for循环之前创建一个可变的向量,并调用push将a存储line在向量中的方法。在后for循环,我们回到了载体,如清单12-19英寸
文件名:src/lib.rs
清单12-19:存储匹配的行,以便我们可以返回它们
现在,该search函数应仅返回包含的行query,并且测试应通过。让我们运行测试:
我们的测试通过了,所以我们知道它有效!
在这一点上,我们可以考虑重构搜索功能实现的机会,同时保持测试通过以保持相同的功能。搜索功能中的代码还不错,但是它没有利用迭代器的一些有用功能。我们将在第13章返回该示例,在此我们将详细探讨迭代器,并研究如何改进它。
现在该search函数正在运行并经过测试,我们需要search从run函数中调用。我们需要将config.query值和从文件contents中run读取的值传递给search函数。然后run将打印从返回的每一行search:
文件名:src/lib.rs
我们仍在使用for循环从中返回每一行search并进行打印。
现在整个程序应该可以工作了!让我们尝试一下,首先使用一个单词,该单词应该与艾米莉狄金森的诗“青蛙”恰好返回一行:
凉!现在,让我们尝试一个可以匹配多行的单词,例如“body”:
最后,让我们确保在搜索诗歌中没有出现的单词时不会出现任何行,例如“monomorphization”:
优秀的!我们构建了自己的经典工具迷你版,并学到了很多有关如何构建应用程序的知识。我们还学到了一些有关文件输入和输出,生存期,测试和命令行解析的知识。
为了完善该项目,我们将简要演示如何使用环境变量以及如何将其打印为标准错误,这在编写命令行程序时都非常有用。

主题测试文章,只做测试使用。发布者:最新稳定辅助网,转转请注明出处:https://www.744broad.com/14969.html

(0)
上一篇 2023年3月6日 上午6:44
下一篇 2023年3月6日 上午6:50

相关推荐

  • 英语句子记忆与背诵(95)

    英语句子记忆与背诵(95) 1、Nothingworthhavingcomeseasy.Itwilltestifyoureallydeservewhatyouwant.Youhavetoshowthemthatyouaremorethanworthyforit.Ifsomethingcomeseasy,thenmaybeit’snotforyou.Easyc…

  • 《旷野之息》与《方舟》的结合体:《Towers》究竟是一款怎样的游戏?

    《旷野之息》与《方舟》的结合体:《Towers》究竟是一款怎样的游戏? 随着大量开放式生存游戏进入市场,这个品类的竞争已经十分激烈,新游戏突围正变得越来越困难。在上个月,神秘新作《塔》(Tower)的一段预告片给人们留下了深刻印象,颇有《塞尔达传说:旷野之息》《异度神剑》和《奇诺冲突》(ZenoClash)的影子。片中展示了许多奇异的生物、奇观异景和不断发展…

    RUST资讯 2023年2月13日
    60
  • 推荐五部超好看的爽剧,放假回家看

    推荐五部超好看的爽剧,放假回家看 ​即将放假,就先不推新剧了。今天一次性给大家安利五部曾经推荐过的经典剧集,错过的就开补吧——《罗马》RomeHBO史上最贵的历史剧《罗马》,单季投资高达一亿美元。波澜壮阔的场面,扣人心弦的情节,扑面而来的史诗感…剧组按照2:3的比例重建整个古罗马斗兽场和亚历山大灯塔,3000件戏服严格按照两千多年前的工艺制成,真…

  • 2018年读一篇经典散文3艾芜的《冬夜》

    2018年读一篇经典散文3艾芜的《冬夜》 冬夜作者:艾芜冬天一个冰寒的晚上。在寂宽的马路旁边,疏枝交横的树下,候着最后一辆搭客汽车的,只我一人。虽然不远的墙边,也蹲有一团黑影,但他却是伸手讨钱的。马路两旁,远远近近都立着灯窗明灿的别墅,向暗蓝的天空静静地微笑着。在马路仁是冷冰冰的,还刮着一阵阵猛厉的风。留在枝头的一两片枯叶,也不时发出破碎的哭声。那蹲着的黑影…

    RUST资讯 2023年2月15日
    60
  • 用Rust清理eclipse自动升级后的重复插件

    用Rust清理eclipse自动升级后的重复插件 eclipse自动升级版本之后,在/eclipse/plugins目录仍然会保留旧版本的插件,想要写一个脚本清理插件,正好最近刚学习rust编程,便用rust开发了一个eclipse插件清理工具eclean。本文简单介绍清理工具的开发过程,详细源代码可以在github下载并自行编译:工具支持清理eclipse…

    RUST资讯 2023年3月10日
    40
  • 生活中的化学消毒剂你用对了吗?

    生活中的化学消毒剂你用对了吗? 化学消毒剂是指用于杀灭传播媒介上病原微生物,使其达到无害化要求的制剂。不同于抗生素,化学消毒剂在防病中的主要作用是将病原微生物消灭于人体之外,切断传染病的传播途径,达到控制传染病的目的。消毒剂不是浓度越高越好,过度使用会带来其他风险。如过氧乙酸是一种强氧化剂,可以轻易地将微生物杀灭,常用于衣物、地面、墙壁、房屋空间等的消毒,但…

  • Rust语言:Facebook希望将其纳入主流编程语言

    Rust语言:Facebook希望将其纳入主流编程语言 Facebook已经加入了Rust基金会(RustFoundation),并与AmazonWebServices,Google,Huawei,Microsoft和Mozilla一起加入了Rust基金会。Facebook是最新采用Rust的技术巨头,Rust是Mozilla最初开发的一种语言,由于与快速语…

    RUST资讯 2023年2月21日
    60
  • Tauri为多平台部署构建优化、安全且独立于前端的程序框架

    Tauri为多平台部署构建优化、安全且独立于前端的程序框架 《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的Tauri专为多平台部署构建优化、安全且独立于前端的应用程序框架。Tauri是一个框架,用于为所有主要桌面平台构建微小、极快的二进制文件。开发人员可以集成任何可编译为HTML、J…

    RUST资讯 2023年2月22日
    40
  • WebAssembly 现状与实战

    WebAssembly 现状与实战 自从JavaScript诞生起到现在已经变成最流行的编程语言,这背后正是Web的发展所推动的。Web应用变得更多更复杂,但这也渐渐暴露出了JavaScript的问题:针对以上两点缺陷,近年来出现了一些JS的代替语言,例如:以上尝试各有优缺点,其中:三大浏览器巨头分别提出了自己的解决方案,互不兼容,这违背了Web的宗旨;是技…

    RUST资讯 2023年2月22日
    70
  • 头屑:消除误会,一头清爽

    头屑:消除误会,一头清爽 头皮屑有两个特点:一是有广泛的群众基础——调查表明,在进入青春期时,有接近一半人会出现头皮屑增多的状况;二是带来了巨大的商机——只要看看电视广告、超市货架,就会知道“去屑”这个市场有多大。(图片来自网络)虽然关注者和市场都颇为庞大,但关于头屑,人们仍然有许多误会。在2011年5月底的第22届世界皮肤科大会上,上海市皮肤科医院副院长王…

关注微信