Как перехватить после того, как пример имеет результат выполнения и статус с флагом: aggregated_failures - PullRequest
1 голос
/ 26 марта 2019

Я поддерживаю автономный пакет автоматизации тестирования, написанный на Rspec & Capybara и SitePrism (No Rails).

Недавно я начал интегрировать его с Testrail для создания отчетов - я использовал rspec-testrail драгоценный камень для этого, но мне пришлось немного его изменить, потому что я также хотел отправлять уведомления Slack с ходом тестирования и отчетом.

В любом случае, интеграция работает гладко, за исключением того факта, что обработка примера опирается на примерналичие исключения и отсутствие исключения приводит к установке статуса теста как пройденного на Testrail.Как видно, after :each и after :example в Rspec.configure не гарантируют, что пример завершился.Я также попытался around :example и around :each, как описано здесь , но безрезультатно.

Я проверил содержимое example.metadata и похоже, что example.metadata[:execution_result] имеет только started_atпеременная, но законченный пример будет также иметь переменные finished_at и status, в соответствии с документами

Мое подозрение (после прочтения документации по рецепту) состоит в том, что :aggregated_failures являетсяПричиной различий в структуре метаданных и множественных ожиданий является выполнение в потоках, которые впоследствии объединяются в одну обратную трассировку.

Знаете ли вы, как я могу дождаться завершения примера или как подключиться к состоянию, в котором он завершен?Или, может быть, мне следует создать собственный форматировщик, к которому я буду подключаться после того, как пример уведомлений будет напечатан на консоли (я хотел бы сохранить там трассировку стека).

Мой код выглядит следующим образом:

Test (оба утверждения ошибочны):

require 'spec_helper'

feature 'Sign in' do
  let(:login_page) { LoginPage.new }
  let(:user) { { email: ENV['ADMIN_EMAIL'], password: ENV['ADMIN_PASSWORD'] } }

  scenario 'is successful and user is redirected to dashboard for user with correct credentials', testrail_id: 5694 do
    login_page.load
    login_page.form.email.set(user[:email])
    login_page.form.password.set(user[:password])
    login_page.form.submit_btn.click
    expect(login_page.sidebar).to have_jobs(text: "some_nonexistenttext")
    login_page.logout
    expect(current_url).to have_content "google.com"
  end
end

Вывод на консоль из вышеприведенного теста:

Failures:

  1) Sign in is successful and user is redirected to dashboard for user with correct credentials
     Got 2 failures:

     1.1) Failure/Error: expect(login_page.sidebar).to have_jobs(text: "blala")
            expected #has_jobs?({:text=>"some_nonexistenttext"}) to return true, got false
          # ./spec/auth/login_spec.rb:13:in `block (3 levels) in <top (required)>'

     1.2) Failure/Error: expect(current_url).to have_content "google.com"
            expected to find text "google.com" in "https://example.com/"
          # ./spec/auth/login_spec.rb:15:in `block (3 levels) in <top (required)>'

Finished in 53.91 seconds (files took 1.45 seconds to load)
4 examples, 1 failure

Failed examples:

rspec ./spec/auth/login_spec.rb:8 # Sign in is successful and user is redirected to dashboard for user with correct credentials

Spec helper:

require 'rubygems'
require 'capybara/rspec'
require 'selenium-webdriver'
require 'site_prism'
require 'slack-notifier'

require_relative '../config'
require_relative '../lib/testrail'

...

RSpec.configure do |config|
  config.define_derived_metadata do |meta|
    meta[:aggregate_failures] = true
  end
  config.example_status_persistence_file_path = 'examples.txt'
  config.before :all do
    testrail_initialize_test_run!
  end

  config.after :example, testrail_id: proc { |value| !value.nil? } do |example|
    RSpec::Testrail.process(example)
  end
end

метод обработки ( слегкамодифицировано от оригинала )

  def process(example)
    if example.exception
      status = 5
      message = example.exception.message
      slack_notifier.publish(message_text "Failed")
    elsif example.skipped? || example.pending?
      puts 'Example skipped or pending'
      status = 10
      message = 'Pending or not implemented'
    else
      status = 1
      message = ''
    end
    client.send_post("add_result_for_case/#{testrun['id']}/#{example.metadata[:testrail_id]}",
                      status_id: status,
                      comment: message)
  end

1 Ответ

0 голосов
/ 29 марта 2019

Так что в основном все, что мне нужно было, - это использовать репортер-слушатель и обрабатывать уведомления внутри него:)

config.reporter.register_listener RSpec::Testrail::Listener.new, :start, :example_failed, :example_passed, :example_pending, :stop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...