sinkcup / laravel-tdd

0 stars 0 forks source link

ARGS parser #8

Open sinkcup opened 4 years ago

sinkcup commented 4 years ago

传入一个程序的参数包含了“标记”(flag)和“值”(value)。标记都是一个字母,前面加上“-”号(例如“-p”这样)。每个标记可以有一个值与之对应,也可以没有对应的值。

我们要开发一个解析器(parser)来处理这些参数。这个解析器需要一个参数结构(schema)来描述“这个程序应该接受哪些参数”的信息,包括:

应该有几个标记; 每个标记应该是什么类型; 每个标记的缺省值是什么。 参数结构指定好以后,就可以把实际接收到的参数列表传给参数解析器。解析器会首先验证参数列表是否与参数结构相匹配。然后,程序就可以向参数解析器查询每个参数的值(根据参数的标记名)。返回值的类型应该与参数结构中规定的类型相一致。

例如程序接收到的参数是这样:

-l -p 8080 -d /usr/logs

那么对应的参数结构应该规定3个标记:l、p、d

“l”(logging,是否记录日志)标记没有与之对应的值,这是一个布尔型的标记,如果传入了“-l”就为True,否则为False。 “p”(port,端口号)标记的值是整数型。 "d"(directory,目录)标记的值是字符串型。 如果参数结构中规定了的标记在实际的参数列表中没有出现,那么就应该返回合理的缺省值,例如布尔型的缺省值可以是False,数值型的缺省值可以是0,字符串型的缺省值可以是空字符串。

如果实际给出的参数与参数结构不匹配,需要给出良好的错误信息,解释清楚出错的原因。

sinkcup commented 4 years ago

这是一个脚本题目,由于 Laravel artisan 已支持参数,所以不能使用框架,而要使用原生 PHP 来做。

sinkcup commented 4 years ago

拆解任务

  1. 写一个原生 PHP 脚本,直接返回,确保 phpunit 能调用到。
  2. 写一个 parse 函数,对它进行单元测试
    • 传入字符串,返回数组
    • 解析无需传值的 bool
    • 解析需要传值的属性
    • 定义传递值的类型
  3. 编写 PHP 脚本的集成测试