[RUBY] Comment valider les tests suivants même si le test échoue

introduction

Parfois, vous voudrez peut-être mettre plusieurs «exemples» dans un «it». Si vous ajoutez simplement plusieurs «exemples», le test suivant ne se déroulera pas lorsque le test échoue, et ** Réparez le test échoué → Échec du test suivant → Corrigez le test échoué ** Répétez C'est gênant. Dans un tel cas, vous pouvez le résoudre en spécifiant ʻaggregate_failures`.

Qu'est-ce que aggregate_failures

En regardant la documentation officielle (https://relishapp.com/rspec/rspec-expectations/docs/aggregating-failures), il explique:

RSpec::Expectations provides aggregate_failures, an API that allows you to group a set of expectations and see all the failures at once, rather than it aborting on the first failure.

En d'autres termes, en spécifiant ʻaggregate_failures`, vous pouvez valider les tests suivants même si le test échoue. Je pense qu'il est plus rapide de voir le comportement, alors j'aimerais l'essayer immédiatement.

Si vous n'utilisez pas aggregate_failures

Vérifions avec le code suivant.

require 'spec_helper'

RSpec.describe 'hoge spec' do
  it 'Être un hoge' do
    expect(1).to eq(2)
    expect(1).to eq(3)
  end
end

Lorsque j'ai exécuté le test, le résultat était le suivant.

hoge spec
Être un hoge(FAILED - 1)

Failures:

  1)hoge spec pour devenir hoge
     Failure/Error: expect(1).to eq(2)

       expected: 2
            got: 1

       (compared using ==)
     # ./spec/hoge_spec.rb:5:in `block (2 levels) in <top (required)>'

Top 1 slowest examples (0.0273 seconds, 89.2% of total time):
hoge spec pour devenir hoge
    0.0273 seconds ./spec/hoge_spec.rb:4

Finished in 0.0306 seconds (files took 0.23906 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/hoge_spec.rb:4 #hoge spec pour devenir hoge

En regardant les résultats, nous pouvons voir qu'après l'échec du premier «attendu», le deuxième «attendu» n'a pas été validé.

Lors de l'utilisation de aggregate_failures

Ensuite, spécifiez ʻaggregate_failures` comme indiqué ci-dessous et exécutez-le.

require 'spec_helper'

RSpec.describe 'hoge spec' do
  it 'Être un hoge' do
    aggregate_failures do
      expect(1).to eq(2)
      expect(1).to eq(3)
    end
  end
end

Le résultat ressemble à ceci.

hoge spec
Être un hoge(FAILED - 1)

Failures:

  1)hoge spec pour devenir hoge
     Got 2 failures from failure aggregation block.
     # ./spec/hoge_spec.rb:5:in `block (2 levels) in <top (required)>'

     1.1) Failure/Error: expect(1).to eq(2)

            expected: 2
                 got: 1

            (compared using ==)
          # ./spec/hoge_spec.rb:6:in `block (3 levels) in <top (required)>'

     1.2) Failure/Error: expect(1).to eq(3)

            expected: 3
                 got: 1

            (compared using ==)
          # ./spec/hoge_spec.rb:7:in `block (3 levels) in <top (required)>'

Top 1 slowest examples (0.0255 seconds, 90.1% of total time):
hoge spec pour devenir hoge
    0.0255 seconds ./spec/hoge_spec.rb:4

Finished in 0.0283 seconds (files took 0.23094 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/hoge_spec.rb:4 #hoge spec pour devenir hoge

Apparemment, le premier «attendu» échoue de la même manière, mais le second «attendu» est également vérifié.

Comment spécifier aggregate_failures

A présent, nous savons que la spécification de ʻaggregate_failures validera les tests suivants même si le test échoue. Il y a plusieurs façons de spécifier ʻaggregate_failures, donc à partir de là, nous verrons comment spécifier chacun d'eux.

Comment spécifier en blocs

Comme mentionné précédemment, il s'agit d'une spécification de bloc.

require 'spec_helper'

RSpec.describe 'hoge spec' do
  it 'Être un hoge' do
    aggregate_failures do
      expect(1).to eq(2)
      expect(1).to eq(3)
    end
  end
end

Comment spécifier comme méta-information

Voici comment le spécifier comme méta-information de ʻit`.

require 'spec_helper'

RSpec.describe 'hoge spec' do
  it 'Être un hoge', :aggregate_failures do
    expect(1).to eq(2)
    expect(1).to eq(3)
  end
end

Mauvais modèle

Essayez de spécifier ʻaggregate_failures` comme premier argument comme indiqué ci-dessous.

require 'spec_helper'

RSpec.describe 'hoge spec' do
  it :aggregate_failures do
    expect(1).to eq(2)
    expect(1).to eq(3)
  end
end

Cliquez ici pour les résultats.

hoge spec
  aggregate_failures (FAILED - 1)

Failures:

  1) hoge spec aggregate_failures
     Failure/Error: expect(1).to eq(2)

       expected: 2
            got: 1

       (compared using ==)
     # ./spec/hoge_spec.rb:5:in `block (2 levels) in <top (required)>'

Top 1 slowest examples (0.02586 seconds, 89.1% of total time):
  hoge spec aggregate_failures
    0.02586 seconds ./spec/hoge_spec.rb:4

Finished in 0.02902 seconds (files took 0.23787 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/hoge_spec.rb:4 # hoge spec aggregate_failures

Comme vous pouvez le voir dans le résultat, si vous le spécifiez avec le premier argument, le traitement suivant ne se déroule pas, donc le comportement attendu n'est pas obtenu. Même si cela échoue, je ne pense pas que je vérifierai si le traitement ultérieur est en cours, donc c'est difficile à remarquer ...

en conclusion

Nous avons vu le comportement de ʻaggregate_failures` et quelques moyens de le spécifier. Personnellement, je pense que c'est correct car la méthode de spécification avec des blocs semble créer une dépendance. Si vous souhaitez inclure plusieurs «exemples», spécifiez «défauts_agrégats».

Recommended Posts

Comment valider les tests suivants même si le test échoue
Y a-t-il une instance même si le constructeur échoue?
Comment se moquer de certaines méthodes de la classe testée
Comment utiliser la méthode link_to
Comment utiliser la méthode include?
Comment faire un test unitaire de Spring AOP
Comment utiliser la méthode form_with
Comment trouver l'angle moyen
Comment utiliser la classe wrapper
Comment ajouter la fonction de suppression
[Java] Comment utiliser la classe File
Comment désactiver le regroupement d'erreurs
[Rails] Comment utiliser la méthode de la carte
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
Comment déterminer le nombre de parallèles
[Java] Comment régler la date sur 00:00:00
[Java] Comment obtenir le répertoire actuel
[Traitement × Java] Comment utiliser la classe
Comment trier une liste de SelectItems
J'étais accro au test Spring-Batch
Comment trouver les dizaines et les unités
Comment passer la valeur à un autre écran
Comment obtenir la date avec Java
[Traitement × Java] Comment utiliser la fonction
Comment tester l'étendue privée avec JUnit
[Java] Comment utiliser la classe Calendar
Résumé de la façon de monter les escaliers de programmation
[SpringBoot] Comment écrire un test de contrôleur
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Comment résoudre les erreurs qui se produisent lors du test d'intégration "Ruby on Rails"