11.2.2.2 测试列表

我们将要测试的函数是广义(generalized,是百度翻译的,不知道到底是什么意思)的版本,输出多字组成的名字;不同的是,函数结果返回名字,而不是打印。结果是有两个列表的元组:一个包含多字的名字,另一个包含单个词的名字。在函数的术语中,这个操作称为分区(partitioning),我们使用来自标准的F# 库中的List.partition 函数,很容易就能实现需要的函数:

> let partitionMultiWord(names:list<string>)=

names|> List.partition (fun name -> name.Contains(" "));;

val partitionMultiWord : string list -> stringlist * string list

partition 函数的一个参数为判断条件(predicate),把输入列表分成两个列表,第一个列表包含条件为 true 的元素,第二个包含剩余的元素。清单11.10 是为前面声明的函数而写的两个单元测试。

清单11.10 分区操作的单元测试(F#)

module PartitionTests =

[<Fact>]

letpartitionKeepLength() =

lettest = ["A"; "A B"; "A B C"; "B" ]

letmulti, single = partitionMultiWord(test)

Assert.True(multi.Length+ single.Length = test.Length)  [1]<-- 验证返回列表的长度

[<Fact>]

letpartitionNonEmpty() =

lettest = ["Seattle"; "New York"; "Reading"]

letexpected = ["New York"], ["Seattle"; "Reading"]

Assert.Equal(expected,partitionMultiWord(test))  <-- 用结构相等测试结果

清单11.10 显示了两个单元测试,实现的函数用Fact 特性值标志。第一个测试[1]检查结果返回两个列表的长度之和,与原始列表的长度相同。这个简单的方法能够验证经过分区以后,各部分没有丢失任何元素。在这个清单中,只有一个输入(值test),我们也可以简单地扩展这个测试,使用多个输入列表。

第二个测试更有意义,因为使用了我们前面讨论的结构相等特征。它声明了两个值,一个是测试的输入值,另一个表示测试输出的期望值。expected 是元组值,有两个列表,第一个列表只包含一个元素,是唯一的由多字组成的名字,第二个列表包含一个字的名字,顺序与在输入列表中出现的相同。如果运行测试,判断[2]成功,因为运行时使用结构相等,比较元组,和元组中包含的列表。实际上,是比较列表中所有单独的字符串。

正如我们所看到的,结构相等是简单而重要的功能,简化单元测试,虽然它不是函数式编程的基本内容。帮助测试的更重要、更本质的函数技术,是函数组合(function composition)。

时间: 2024-08-23 21:12:07

11.2.2.2 测试列表的相关文章

C++11:移动构造函数的测试

C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> using namespace std; class CTest { private: std::size_t size; char* buffer; public: CTest(std::size_t size) : size(size), buffer(nullptr) { buffer = new c

VS2010编译器工具cl对c++11标准支持情况测试

本文探讨了VS2010编译工具cl对C++11标准的支持情况,提供了利用C++11新特性的两段代码来进行测试,并同g++ 4.9.3编译器的编译情况相对比.总的说来:VS2010的编译器工具cl部分支持了C++11标准,而g++ 4.9.3则全部支持C++11标准.虽然现在已出现了C++14等新的标准,但熟悉了C++11标准的支持情况有利于我们正确选用符合自己需要的编译工具. 1. 问题产生 一个月前由于编写算法的而使用C++语言,看了一些英文版的算法设计和分析书.一个偶然的机会发现了C++11

Linux 0.12和Linux 0.11内核学习——Google邮件列表

亲,你在学习Linux 0.12或0.11内核吗?快来加入我们吧,就缺你了!!! 为什么选用邮件列表呢?因为赵炯博士那个论坛交流不是很方便,经常发了贴没人回,人气相比十年前论坛刚成立时弱了不少.很多人,很多元老级别的人物,消失了...再也没有出现过. 而QQ群很繁杂,比如你肯定会因为一些兴趣爱好加入一些QQ群,但是也就刚加进去或者自己有什么要问的时候说几句,之后就屏蔽了,因为每天都有人在聊天,什么内容都有,想退群却又怕以后有用,不退吧又很烦,只能屏蔽了潜水. 而邮件列表,你可以订阅主题,实时追踪

11、查看及测试网络、配置网络地址、内核及模块管理

一.Linux备份策略 1.tar完全备份 -N yyyy-mm-dd 备份..后更新的文档 文件看ctime 目录看atime -p 保留原有属性权限 -P保留原有绝对路径不变 --exclude排除不需要备份的文档 2.touch:修改文件时间和创建新文件 atime:文件的内容被取用,如cat mtime:文件内容数据被改 ctime:文件的状态改变,如权限与属性 ls -lu 查看atime l  查看mtime -lu 查看ctime 3.stat:查看对应文件的响应时间信息 4.du

【11.2晚校内测试】【装桶模拟】【单调栈】

真的是fo了,晚上还来一次测试...... mister[问题描述] 不久前 Mister 从太空中探测到一个奇怪的信号,他开始研究这个信号. 经过一些变换后,这个信号变成了长度为 n 的排列或者它的循环移位.对于进一步的研究 Mister 需要一些数据分析,这就是为什么他决定选择这个排列的循环移位,它有最小的可 能偏差.我们把排列的偏差定义为 求一个可能偏差最小的排列 p 的循环移位. 让我们表示 k(0≤k < n)的循环移位排列 p 的变化需要达到这种转变,例如: k = 0: 变成 p1

Python脚本测试---列表的排序和删除

>>> a = [] >>> a.append(33) >>> a.append(44) >>> a.append(22) >>> a.append(34) >>> a [33, 44, 22, 34] >>> a.sort() >>> a [22, 33, 34, 44] >>> a.pop() 44 >>> a [22, 3

C++11 可变参数模板构造string列表

#include <iostream> #include <cstdint> #include <list> #include <string> template<typename T> typename std::enable_if<std::is_integral<T>::value, std::string>::type to_string(const T & val) { return std::to_st

C++11 —— 解包 tuple 参数列表

??tuple 的主要用途,就是把各种类型的参数组合成一个新的数据关联体(结构体),相当于早期的 std::pair 的泛化版本. ??组合存储是方便了,但是,对于某些特定的应用场景,解包就成了个比较麻烦的事情.为此,我查看 gcc 8.2.0 版的 STL 源码,从 functional 文件中 提取出 tuple 索引号生成的代码,并略作更名(避免冲突),得到如下 nstuple 命名空间内的代码,这其中可变参数模板类的递归构建,用得甚是精妙,值得学习. namespace nstuple

11.2.3 测试组合函数

在第11.1.2 节,我们讨论跟踪代码中的依赖关系时,使用的C# 方法,类似于上两个示例中的F# 函数,演示函数式编程使得更容易识别函数做什么,访问什么数据.这不仅在写代码时非常有用,而且在测试时也极其有用. 在第11.1 节,我们写过一个命令式方法,打印出由多字组成的名字,但是,它有副作用,会从作为参数传递进来的可变列表中删除元素.只要我们以后不再使用这个列表,就不会引起任何问题.对这个方法的任何单元测试以检查打印输出,都会成功. 使这个方法棘手的是,如果我们把它与其他同样正确的方法连一起使用