如何找到 Rspec 中每个测试用例所花费的时间
how to find the time taken for each testcase in Rspec
我在我的项目中使用 Rspec,我想在其中打印每个测试用例所花费的时间,Rspec 是否可以提供任何预建函数?我可以通过 example.execution_result.started_at
获取测试用例的开始时间,但我不知道如何获取测试用例的结束时间,如果我可以获取结束时间,那么我可以从开始时间中减去结束时间得到每个测试用例的持续时间。这个地方有人帮我吗?我写了这段代码
around(:each) do |example|
startTime=Time.now
var=example.run
puts var
endTime=Time.now
duration=endTime-startTime
puts "Time Taken->#{duration.to_f/60.to_f}"
end
但我坚信 Rspec 必须为 return 每个测试用例的持续时间提供一些预定义的方法,有人知道吗?
每个示例都会得到一个具有 run_time
方法的 ExecutionResult 对象,因此 example.execution_result.run_time
应该可以满足您的要求
RSpec 有一个 example_status_persistence_file_path 配置,它为每个单独的测试生成一个包含 运行 时间的文件。
例如,给定以下 RSpec configuration/examples:
require 'rspec/autorun'
# Enable the reporting
RSpec.configure do |c|
c.example_status_persistence_file_path = 'some_file.txt'
end
# Run some tests
RSpec.describe 'some thing' do
it 'does stuff' do
sleep(3)
end
it 'does more stuff' do
sleep(2)
end
end
生成每个示例的状态和 运行 时间的报告:
example_id | status | run_time |
--------------- | ------ | ------------ |
my_spec.rb[1:1] | passed | 3.02 seconds |
my_spec.rb[1:2] | passed | 2.01 seconds |
如果您想要更多详细信息and/or想要控制格式,您可以创建自定义格式化程序。
例如,给定以下规格:
RSpec.describe 'some thing' do
it 'does stuff' do
sleep(3)
raise('some error')
end
it 'does more stuff' do
sleep(2)
end
end
输出 - 文本
我们可以添加自定义格式化程序来输出完整的测试描述、状态、运行时间和异常:
class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
RSpec::Core::Formatters.register self
def close(_notification)
@output_hash[:examples].map do |ex|
output.puts [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]].join(' | ')
end
end
end
RSpec.configure do |c|
c.formatter = ExampleFormatter
end
这给了我们:
some thing does stuff | failed | 3.010178 | {:class=>"RuntimeError", :message=>"some error", :backtrace=>["my_spec.rb:21:in `block... (truncated for example)
some thing does more stuff | passed | 2.019578 |
可以修改输出以添加 headers、具有更好的格式等
输出 - CSV
可以修改格式化程序以输出到 CSV:
require 'csv'
class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
RSpec::Core::Formatters.register self
def close(_notification)
with_headers = {write_headers: true, headers: ['Example', 'Status', 'Run Time', 'Exception']}
CSV.open(output.path, 'w', with_headers) do |csv|
@output_hash[:examples].map do |ex|
csv << [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]]
end
end
end
end
RSpec.configure do |c|
c.add_formatter(ExampleFormatter, 'my_spec_log.csv')
end
给出:
Example,Status,Run Time,Exception
some thing does stuff,failed,3.020176,"{:class=>""RuntimeError"", :message=>""some error"", :backtrace=>[""my_spec.rb:25:in `block...(truncated example)"
some thing does more stuff,passed,2.020113,
我在我的项目中使用 Rspec,我想在其中打印每个测试用例所花费的时间,Rspec 是否可以提供任何预建函数?我可以通过 example.execution_result.started_at
获取测试用例的开始时间,但我不知道如何获取测试用例的结束时间,如果我可以获取结束时间,那么我可以从开始时间中减去结束时间得到每个测试用例的持续时间。这个地方有人帮我吗?我写了这段代码
around(:each) do |example|
startTime=Time.now
var=example.run
puts var
endTime=Time.now
duration=endTime-startTime
puts "Time Taken->#{duration.to_f/60.to_f}"
end
但我坚信 Rspec 必须为 return 每个测试用例的持续时间提供一些预定义的方法,有人知道吗?
每个示例都会得到一个具有 run_time
方法的 ExecutionResult 对象,因此 example.execution_result.run_time
应该可以满足您的要求
RSpec 有一个 example_status_persistence_file_path 配置,它为每个单独的测试生成一个包含 运行 时间的文件。
例如,给定以下 RSpec configuration/examples:
require 'rspec/autorun'
# Enable the reporting
RSpec.configure do |c|
c.example_status_persistence_file_path = 'some_file.txt'
end
# Run some tests
RSpec.describe 'some thing' do
it 'does stuff' do
sleep(3)
end
it 'does more stuff' do
sleep(2)
end
end
生成每个示例的状态和 运行 时间的报告:
example_id | status | run_time | --------------- | ------ | ------------ | my_spec.rb[1:1] | passed | 3.02 seconds | my_spec.rb[1:2] | passed | 2.01 seconds |
如果您想要更多详细信息and/or想要控制格式,您可以创建自定义格式化程序。
例如,给定以下规格:
RSpec.describe 'some thing' do
it 'does stuff' do
sleep(3)
raise('some error')
end
it 'does more stuff' do
sleep(2)
end
end
输出 - 文本
我们可以添加自定义格式化程序来输出完整的测试描述、状态、运行时间和异常:
class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
RSpec::Core::Formatters.register self
def close(_notification)
@output_hash[:examples].map do |ex|
output.puts [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]].join(' | ')
end
end
end
RSpec.configure do |c|
c.formatter = ExampleFormatter
end
这给了我们:
some thing does stuff | failed | 3.010178 | {:class=>"RuntimeError", :message=>"some error", :backtrace=>["my_spec.rb:21:in `block... (truncated for example) some thing does more stuff | passed | 2.019578 |
可以修改输出以添加 headers、具有更好的格式等
输出 - CSV
可以修改格式化程序以输出到 CSV:
require 'csv'
class ExampleFormatter < RSpec::Core::Formatters::JsonFormatter
RSpec::Core::Formatters.register self
def close(_notification)
with_headers = {write_headers: true, headers: ['Example', 'Status', 'Run Time', 'Exception']}
CSV.open(output.path, 'w', with_headers) do |csv|
@output_hash[:examples].map do |ex|
csv << [ex[:full_description], ex[:status], ex[:run_time], ex[:exception]]
end
end
end
end
RSpec.configure do |c|
c.add_formatter(ExampleFormatter, 'my_spec_log.csv')
end
给出:
Example,Status,Run Time,Exception some thing does stuff,failed,3.020176,"{:class=>""RuntimeError"", :message=>""some error"", :backtrace=>[""my_spec.rb:25:in `block...(truncated example)" some thing does more stuff,passed,2.020113,