您可以使用以下方法提取 SQL 请求的输出:
command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
该mysql -u <user> -p -e
部件是从 Linux 命令执行 SQL 查询所必需的。如果您使用的是 Window,则可能需要使用 Window sqlcmd
。command
这允许 SQL 查询使用该方法成功执行。
该command
方法在这里工作的原因是因为它是一个自定义的 RSpec 类型(因此隐含地也是一个类构造函数,因为 Ruby 有构造函数),它将在测试系统上本地或远程执行。该.stdout
方法是类的成员,用于捕获命令的标准输出。.split
将确保输出变量存储在空格分隔的数组中。
现在我们可以在下一个命令中使用它,如下所示:
# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
describe command("ls -l #{variable}/.. | egrep \"^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql\"") do
its('stdout') { should match ''}
end
end
上面我们遍历 SQL 查询中捕获的变量数组,并在describe command()
RSpec 测试中对其进行测试。执行此测试的更好方法是测试command
匹配器中的标准输出,而不是egrep
. 这样做并清理match
方法:
# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
describe command("ls -l #{variable}/..") do
its('stdout') { should_not match(/^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql/)}
end
end
更新到未弃用的 RSpec 匹配器并将stdout
方法的调用修复为字符串而不是我们到达的符号:
# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
describe command("ls -l #{variable}/..") do
its(:stdout) { is_expected.to_not match(/^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql/)}
end
end
我们可以做的另一个改进是使用更适合file
的类型和权限匹配器而不是原始命令。这有助于独立于平台的测试:
# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in file type
variables.each do |variable|
describe file("#{variable}/..") do
# check permissions
it { expect(subject).to_not be_owned_by 'mysql' }
it { expect(subject).to_not be_grouped_into 'mysql' }
it { expect(subject).to_not be_executable_by 'mysql' }
end
end
我知道这里有一些很好的地方可以实现您正在寻找的功能以及许多修复和改进,因此请务必仔细检查代码和解释以了解我在这里所做的一切。