lucatume / codeception-setup-local
为Codeception提供的灵活本地设置
Requires
Requires (Dev)
- codeception/codeception: ^2.1
- mikey179/vfsstream: ^1.6
README
额外的命令可以使团队之间更容易地本地设置Codeception。
安装
- 使用Composer安装包
composer require --dev lucatume/codeception-setup
- 在
codeception.yml
文件中将命令添加到Codeception扩展中
extensions: commands: - tad\Codeception\Command\SearchReplace - tad\Codeception\Command\Setup
用法
这两个命令都将可在codecept
CLI工具中使用
codecept search-replace foo bar some-source-file some-destination-file codecept setup ./setup.yml
两个命令都支持--save-config
选项;当使用时,运行命令指定的任何选项的值将被写入到commands-config.yaml
文件。
在随后的运行中,任何未指定值的选项将默认为存储的值;这仅适用于选项(--option-name
格式)值,每次运行命令时都需要指定参数。
search-replace
简单来说,这个命令将替换文件中的字符串实例,并可以选择将结果重写回同一文件或输出到指定的输出文件。
使用这个命令,可以自动化共享用于设置固定值的文件,从而实现这些固定文件的“本地化”。
例如,一个团队可能共享一个用于在分发格式中设置验收测试的数据库转储;需要为团队成员中的每个人定制数据库转储,替换其中的一些值。
以下命令将替换dump.sql
文件中所有http://site.local
实例为http://localhost:8080
。
codecept search-replace http://site.local http://localhost:8080 ./tests/_data/dump.sql
为了避免修改一个公共源文件,可以指定一个可选的输出文件,如下所示
codecept search-replace http://site.local http://localhost:8080 ./tests/_data/dump.dist.sql ./tests/_data/dump.sql
该命令是无文件感知的,可以用于任何文件;以下也是一个合法的使用示例
codecept search-replace http://site.local http://localhost:8080 ./tests/acceptance.suite.dist.yml ./tests/acceptance.suite.yml
如果在循环中使用,某些源文件可能缺失;在这种情况下,可以使用--skip-if-missing
选项来避免在源文件缺失时出现错误
FILES="./tests/_data/dump1.sql ./tests/_data/dump2.sql ./tests/_data/dump3.sql" for f in $FILES do codecept search-replace http://site.local http://localhost:8080 $f --skip-if-missing done
setup
在团队共享的同一行上,可能需要更复杂的设置程序来设置本地、可使用和定制的测试环境。
虽然始终可以选择在存储库中嵌入shell脚本,但setup
尝试通过Yaml配置文件来减少所需的知识。
如果没有指定要使用的配置文件,则命令将尝试在项目根目录中查找setup.yml
文件
codecept setup
可以使用可选参数指定要使用的配置文件
codecept setup local-setup-config.yml
一个基本的本地设置配置文件可能如下所示
foo: var: name: first question: First var value? default: 23 message: Var value is \$first
控制台命令输出将如下所示
> Configuring "foo"... > First var value? (23) // user inputs 'bar' and presses Enter > Var value is bar
if setup指令
任何指令都可以使用简单的if
或unless
语法条件执行。if
条件将确保在指定的条件为真时执行指令;unless
条件将确保在指定的条件为假时执行指令。
两种情况下的条件语法是
<var> (is|not) <value>
以下配置文件将在“show”变量不为“no”时显示消息“Hello world”。
Show: var: name: show question: Show the message? validate: yesno default: yes message: unless: show is no value: Hello world
这等价于
Show: var: name: show question: Show the message? validate: yesno default: yes message: if: show not no value: Hello world
条件也可以是一个存在性条件,检查变量是否为空或非空
Show: var: name: show question: Show the message? validate: yesno default: yes message: if: show value: Hello world
for循环设置指令
message
、command
和exec
都支持for
参数。
此参数允许指令根据用户输入或硬编码的变量重复执行任意次数。
以下设置说明将在根目录中创建3个文件
foo: exec: for: fileName in one,two,three value: touch $fileName.txt
字符串 one,two,three
代表一个以逗号分隔的值数组。格式允许在逗号周围有空格以改善可读性;下面的设置文件
foo: message: for: name in John, Marc, Daniel value: Hello $name!
将输出
你好,约翰!你好,马克!你好,丹尼尔!
变量也可以在for循环中使用,但这些必须是整数值
foo: var: name: times validate: int default: 3 question: How many times to loop? message: if: times for: i in times value: Loop run $i
将输出,假设用户输入为 4
循环运行 1 循环运行 2 循环运行 3 循环运行 4
请注意,循环对人类友好,从 1
开始,而不是开发者习惯的 0
。
var
请用户输入变量值 或 存储变量值。
在第一种情况下,所需的 var
指令字段为
name
- 变量在设置文件中引用的名称question
- 将提示用户输入变量值的提问
如果目的是存储用于以后使用的值,则所需的字段为
name
- 变量在设置文件中引用的名称value
- 应该存储在变量中的值
可选参数包括
default
- 如果用户没有提供任何值(按Enter键而不输入任何内容),则变量默认值validate
- 变量应该验证的类型;命令将不断提示用户输入有效值,直到用户输入它;支持的类型有int
、float
、bool
、url
、email
、yesno
。
此外,还提供了regexp
验证模式,支持默认的PHP验证。
break
如果需要停止 setup
执行,则可以使用 break
指令。
指令有两个参数
if
或unless
条件 - 是否停止执行;必需value
- 执行停止前要显示的消息;可选
示例用法
config-name: var: name: stop question: stop? validate: yesno break: if: stop value: Stopped. message: Will not see this.
message
向用户显示消息。
消息可以是单行参数,如下所示
config-block: message: Hello world!
或多行参数,以允许指定条件
config-block: message: if: someVar is yes value: Hello world!
在后一种情况下,需要 value
参数。
可以使用 $varName
语法在 message
中替换之前获取的变量值
config-block: var: name: yourName question: What's your name? default: Luca message: if: yourName value: Hello $yourName!
command
运行在 codecept
CLI 工具上注册的子命令;一个例子是上面提到的 search-replace
子命令。command
指令可以是单行指令
config-block: command: search-replace foo bar ./tests/_data/dump.dist.sql ./tests/_data/dump.sql
如果需要指定条件,则可以是多行指令
config-block: var: name: runCommand validate: yesno default: yes question: run the command? command: if: runCommand is yes value: search-replace foo bar ./tests/_data/dump.dist.sql ./tests/_data/dump.sql
可以使用 $varName
语法在 command
指令中替换之前获取的变量值
config-block: var: name: domain validate: url default: http://local.dev question: local development domain? command: search-replace http://dist-domain.dev $domain ./tests/_data/dump.dist.sql ./tests/_data/dump.sql
exec
使用PHP exec()
函数运行脚本。exec
指令可以是单行指令
config-block: exec: touch somefile.txt
如果需要指定条件,则可以是多行指令
config-block: var: name: runExec validate: yesno default: yes question: touch somefile.txt? exec: if: runExec is yes value: touch somefile.txt
可以使用 $varName
语法在 exec
指令中替换之前获取的变量值
config-block: var: name: fileName default: someFile question: filename? exec: touch $fileName.txt
setup:scaffold
虽然可以轻松创建可消耗的 setup
命令文件,但 setup:scaffold
命令的诞生是为了提供一个快速起点。
由于项目无关,它应该在本地测试环境设置完成后使用。
命令允许一些选项
--destination
- 默认情况下,命令将把设置文件写入项目根目录中的setup.yml
文件:相对路径将从项目根目录解析。--skip-suites
- 默认情况下,如果不存在,则命令将生成每个套件配置文件(*.suite.yml
)的分发版本:使用此选项来跳过它。--yes
- 对命令所需的确认请求回答y
。