Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails

Lorsque j'écris un cas de test, j'obtiens une histoire sur la couverture qu'il couvre.

Qu'est-ce que la couverture de code? J'ai pensé, alors je vais le résumer comme mon mémorandum.

Qu'est-ce que la couverture de code?

Lors des tests logiciels, tout le code de programme (logique interne) à tester C'est le rapport (taux de couverture) de la partie du corps qui a été testée. Référence

Couverture typique

C0: Couverture de l'instruction

Chaque instruction est exécutée au moins une fois

C1: Couverture des succursales

Exécuter au moins une fois pour chaque condition de jugement

C2: Couverture de l'état

L'authenticité dans chaque instruction conditionnelle est exécutée au moins une fois

MCC: couverture complète des conditions

Toutes les combinaisons de vérité et de mensonge qui peuvent être placées dans chaque condition sont exécutées

En fait, rédigez des tests en gardant à l'esprit la couverture avec Rspec

Code Ruby à tester

sample.rb


module CodeCoverage
  class << self
  # main
  # @params [interger] x
  # @params [interger] y
  # @return [String]Chaînes de caractères qui diffèrent selon les valeurs de x et y
  #
  #L'argument suppose seulement un entier
  def main(x, y)
    result = ''
    if x >= y || x % 2 == 0
      result << 'Processus 1'
    else
      result << 'Processus 2'
    end
    if x*y > 10
      result << 'Processus 3'
    else
      result << 'Processus 4'
    end
    return result
  end
  end
end

Code de test écrit en Rspec

Qu'est-ce que Rspec

Un des frameworks pour réaliser le TDD (Test Driven Development), qui est l'une des méthodes de développement de Ruby on Rails Référence

Corps du code de test

RSpec.describe CodeCoverage do
  shared_examples 'Processus 1 et processus 3 passes' do
    it 'Le libellé du processus 1 et du processus 3 est renvoyé' do
      expect(subject).to eq 'Processus 1 Processus 3'
    end
  end
  shared_examples 'Processus 1 et processus 4 passes' do
    it 'Le libellé du processus 1 et du processus 4 est renvoyé' do
      expect(subject).to eq 'Processus 1 Processus 4'
    end
  end
  shared_examples 'Processus 2 et processus 3 passes' do
    it 'Le libellé du processus 2 et du processus 3 est renvoyé' do
      expect(subject).to eq 'Processus 2 Processus 3'
    end
  end
  shared_examples 'Processus 2 et processus 4 passes' do
    it 'Le libellé du processus 2 et du processus 4 est retourné' do
      expect(subject).to eq 'Processus 2 Processus 4'
    end
  end

  describe 'main' do
    subject { described_class.send(:main, x, y) }
      # C0:Couverture de l'instruction
    #Écrire pour exécuter au moins une fois avec peu d'instructions
      context 'Pour C0' do
        context 'Passez par le processus 1 et le processus 3' do
          let(:x) { 11 }
          let(:y) { 1 }
          it_behaves_like 'Processus 1 et processus 3 passes'
        end
        context 'Passez par le processus 2 et le processus 4' do
          let(:x) { 1 }
          let(:y) { 9 }
          it_behaves_like 'Processus 2 et processus 4 passes'
        end
      end
      # C1:Couverture des succursales
      #Exécuter au moins une fois pour chaque condition de jugement
      context 'Pour C1' do
        context 'Passez par le processus 1 et le processus 3' do
          let(:x) { 11 }
          let(:y) { 1 }
          it_behaves_like 'Processus 1 et processus 3 passes'
        end
        context 'Passez par le processus 1 et le processus 4' do
          let(:x) { 3 }
          let(:y) { 2 }
          it_behaves_like 'Processus 1 et processus 4 passes'
        end
        context 'Passez par le processus 2 et le processus 3' do
          let(:x) { 3 }
          let(:y) { 5 }
          it_behaves_like 'Processus 2 et processus 3 passes'
        end
        context 'Passez par le processus 2 et le processus 4' do
          let(:x) { 1 }
          let(:y) { 4 }
          it_behaves_like 'Processus 2 et processus 4 passes'
        end
      end
      
      # C2:Couverture de l'état
      #L'authenticité dans chaque instruction conditionnelle est exécutée au moins une fois
      context 'Pour C2' do
        context 'x>=y et x*y>10' do
          context 'Passez par le processus 1 et le processus 3' do
            let(:x) { 11 }
            let(:y) { 1 }
            it_behaves_like 'Processus 1 et processus 3 passes'
          end
        end
        context 'x>=y et x*y<10' do
          context 'Passez par le processus 1 et le processus 4' do
            let(:x) { 3 }
            let(:y) { 2 }
            it_behaves_like 'Processus 1 et processus 4 passes'
          end
        end
        context 'x<y et x sont pairs et x*y>10' do
          context 'Passez par le processus 1 et le processus 3' do
            let(:x) { 4 }
       let(:y) { 5 }
            it_behaves_like 'Processus 1 et processus 3 passes'
          end
        end
        context 'x<y et x sont pairs et x*y<10' do
          context 'Passez par le processus 1 et le processus 4' do
            let(:x) { 2 }
            let(:y) { 3 }
            it_behaves_like 'Processus 1 et processus 4 passes'
          end
        end
        context 'x<y et x sont impairs et x*y>10' do
          context 'Passez par le processus 2 et le processus 3' do
            let(:x) { 3 }
            let(:y) { 5 }
            it_behaves_like 'Processus 2 et processus 3 passes'
          end
        end
        context 'x<y et x sont impairs et x*y<10' do
          context 'Passez par le processus 2 et le processus 4' do
            let(:x) { 1 }
            let(:y) { 4 }
            it_behaves_like 'Processus 2 et processus 4 passes'
          end
        end
      end
    end
  end
end

C'est facile à comprendre si vous l'écrivez comme ça. La couverture du code est appropriée, mais au travail, elle dépend de C1.

Recommended Posts

Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails
[Ruby on Rails] Afficher le test avec RSpec
[Ruby on Rails] Test du contrôleur avec RSpec
[Ruby on Rails] Test de modèle avec RSpec
Présentation de Rspec, un framework de test pour Ruby on Rails
[Rails] Test avec RSpec
[Ruby on Rails] Jusqu'à l'introduction de RSpec
Présentation de Rspec avec Ruby on Rails x Docker
Publiez l'application avec ruby on rails
Déterminez la page actuelle avec Ruby on Rails
Exécutez des tests Ruby on Rails RSpec avec des actions GitHub
[Rails] Code de test à l'aide de Rspec
[Ruby on Rails] Saisissez automatiquement une adresse à partir d'un code postal
Programmation avec ruby (en route)
[rails] Faisons un test unitaire avec Rspec!
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
[Ruby on Rails] Vérification du code à l'aide de Rubocop-airbnb
Remarques sur l'utilisation de FCM avec Ruby on Rails
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
[Ruby on Rails] Téléversement de plusieurs images avec refile
J'ai fait un portfolio avec Ruby On Rails
Comment résoudre les erreurs qui se produisent lors du test d'intégration "Ruby on Rails"
Je comprends les paramètres de Ruby on Rails (avec le faceman de poker Hanshin Tigers, Atsushi Nomi)
[Ruby On Rails] Erreur de test utilisant le client RSpec MySQL n'est pas connecté
[Ruby On Rails] Lors de l'exécution d'un test d'unité de modèle avec RSpec à l'aide de FactoryBot, une erreur se produit car la clé externe n'est pas saisie.
[Ruby] Liste de codes de base. Gardez les bases avec des exemples
Exécution du code de test RSpec
[Ruby on Rails] Supprimer les images s3 avec Active Strage
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Testez Nokogiri avec Rspec.
Association Ruby On Rails
[Rails] Assemblez le même code avec les actions du contrôleur
(Ruby on Rails6) Refléter le contenu publié à partir du formulaire
Création d'un plan de site au format RSS / Atom avec Ruby on Rails
Essayez d'utiliser l'attribut de requête Ruby on Rails
[Ruby on Rails] Seul l'utilisateur qui a publié peut modifier
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
[Ruby on Rails] Afficher rapidement le titre de la page dans le navigateur
<Installation de points> Introduction à Ruby on Rails5 Comparaison du code source
(Ruby on Rails6) Affichage de la base de données qui a obtenu l'identifiant de la base de données
Supprimer tout le contenu de la page de liste [Ruby on Rails]
Une note sur la fonction de départ de Ruby on Rails
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
[Note] À propos du problème Fizz_Buzz (Fonctionnement de Ruby on Rails)
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05