0
votes

Test de l'unité à l'aide d'unitest en Python

J'ai besoin d'écrire des cas de test à l'aide d'un test d'unité dans Python pour tester la création de cercle.

  • Définissez une classe Cercle code> avec la méthode __ init __ code> qui initialise un cercle avec attribut radius code>, ayant suivi des restrictions suivantes: p>

    • rayon code> doit être une valeur numérique, si ce n'est pas une erreur de type avec le message d'erreur "Le rayon doit être un numéro". P> li>

    • rayon code> doit être compris entre 0 et 1000 inclus des deux côtés, si ce n'est pas une erreur de valeur avec le message d'erreur "Le rayon doit être compris entre 0 et 1000 inclus" P> li>

    • Définir une méthode de classe zone code> et circonférence code> qui doit renvoyer des valeurs arrondies à 2 décimales. P> li> ul>

      Remplissez la définition de la classe testcirclecreation code> qui teste le comportement de __ init __ code> méthode comme spécification ci-dessous. P> li>

    • définir la méthode de test de test_creature_circle_with_numerical_radius code> qui crée du cercle avec le rayon 2.5 et vérifiez si le rayon correspond à la valeur 2.5 p> li>

    • définir la méthode de test test_creature_circent_with_negative_radius_with_negative_radius code> Qui vérifie si l'exception d'erreur de valeur est soulevée avec le message d'erreur "Le rayon doit être compris entre 0 et 1000 inclus", tout en créant un cercle de rayon 2.5. p> li>

    • définir la méthode de test test_creating_circlele_with_greaterthan_radius code> QUELLE vérifie si ValueError code> est soulevé avec le message d'erreur "Le rayon doit être compris entre 0 et 1000 incluse", tout en créant un cercle de cercle de rayon 1000.1. p> li>

    • définir la méthode de test test_creating_circle_with_nonnumeric_radius code>, qui vérifie si typeError code> est soulevé avec un message d'erreur "Douius doit être numéro" tout en créant un cercle de "Bonjour" . p> li> ul>

      J'ai essayé ci-dessous, mais cela échoue avec une erreur comme p> xxx pré>

      le code: p>

      import inspect
      import re
      import unittest
      import math
      
      # Define below the class 'Circle' and it's methods with proper doctests.
      class Circle:
          def __init__(self, radius):
              # Define the initialization method below
              try:
                  if not isinstance(radius, (int, float)):
                      raise TypeError 
                  elif 1000 >=radius>=0:
                          self.radius=radius 
                  else:
                      raise ValueError        
              except ValueError:
                  raise ValueError("radius must be between 0 and 1000 inclusive")
              except TypeError:
                  raise TypeError("radius must be a number")
              
          def area(self):
              # Define the area functionality below
              y=math.pi*(self.radius**2)
              return round(y,2)
                     
          def circumference(self):
              # Define the circumference functionality below
              x=math.pi*2*self.radius
              return round(x,2)
              
      class TestCircleCreation(unittest.TestCase):
          def test_creating_circle_with_numeric_radius(self):
              # Define a circle 'c1' with radius 2.5 and check if 
              # the value of c1.radius equal to 2.5 or not
              c1=Circle(2.5)        
              self.assertEqual(c1.radius,2.5)
      
          def test_creating_circle_with_negative_radius(self):
              # Try Defining a circle 'c' with radius -2.5 and see 
              # if it raises a ValueError with the message
              # "radius must be between 0 and 1000 inclusive"
              c=Circle(-2.5)
              self.assertEqual(c.radius,-2.5)
              self.assertRaises(ValueError)      
      
          def test_creating_circle_with_greaterthan_radius(self):
              # Try Defining a circle 'c' with radius 1000.1 and see 
              # if it raises a ValueError with the message
              # "radius must be between 0 and 1000 inclusive"
              c=Circle(1000.1)        
              self.assertEqual(c.radius,1000.1)
              self.assertRaises(ValueError)        
              
          def test_creating_circle_with_nonnumeric_radius(self):
              # Try Defining a circle 'c' with radius 'hello' and see 
              # if it raises a TypeError with the message
              # "radius must be a number"
              c=Circle('hello')      
              self.assertEqual(c.radius,'hello')
              self.assertRaises(TypeError)        
      
      if __name__ == '__main__':
          fptr = open('output.txt', 'w')
          
          runner = unittest.TextTestRunner(fptr)
          
          unittest.main(testRunner=runner, exit=False)
          
          fptr.close()
          
          with open('output.txt') as fp:
              output_lines = fp.readlines()
          
          pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                           and line.endswith('.\n')]
          
          pass_count = pass_count[0]
          print(str(pass_count))
                             
          doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
          doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
          doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
          doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)
          
          assert1_count = len(re.findall(r'assertEqual', doc1))
          print(str(assert1_count))
          
          assert1_count = len(re.findall(r'assertEqual', doc2))
          assert2_count = len(re.findall(r'assertRaises', doc2))
          print(str(assert1_count), str(assert2_count))
          
          assert1_count = len(re.findall(r'assertEqual', doc3))
          assert2_count = len(re.findall(r'assertRaises', doc3))
          print(str(assert1_count), str(assert2_count))
          
          assert1_count = len(re.findall(r'assertEqual', doc4))
          assert2_count = len(re.findall(r'assertRaises', doc4))
          print(str(assert1_count), str(assert2_count))
      


0 commentaires

4 Réponses :


0
votes

J'ai supprimé répété self.assertequal (c.radius, -2.5) code> assertions telles qu'elles sont déjà traitées par un autre test d'unité ( test_créat_circle_with_numeric_radius (auto) code>) et causent vos instances d'échec. Voir ici, par exemple: xxx pré>

dans votre code, le Assertequals (c.radius, -2.5) code> tente de déterminer si la valeur c.radius est égal à -2,5. Cette valeur n'est pas définie, car -2.5 code> est en dehors de la plage acceptable et une ValueError est lancée à la place. Cela empêche le Self.AssorTraises (ValueError) Code> d'être vérifié. En supprimant Assertequals code> dans les tests et en le laissant comme il est propre test indépendant, self.assertraises (ValueError) code> s'exécute et vous permet de voir où votre code n'adhère pas aux exigences . P>

J'ai modifié vos tests pour utiliser la gestion de contexte pour attraper les exceptions levées qui ont fait fonctionner correctement les tests p> xxx pré>

bien que cela aurait également travaillé: p> xxx pré>

ps: je vous conseille d'utiliser avec Ouvrir code> lors de l'écriture dans le fichier, comme vous l'avez fait lors de la lecture. P >

            if not isinstance(radius, (int, float)):
                raise TypeError("radius must be a number")

            if not 1000 >=radius>=0:
                raise ValueError("radius must be between 0 and 1000 inclusive")

            self.radius=radius 


4 commentaires

Je reçois la réponse comme 4 1 0 1 0 1 0 1 Mais c'est toujours dit que votre réponse est incorrecte, il a trois chèques pour Assertequal où les exceptions sont soulevées, on dirait que cela provoque le problème s'il vous plaît suggérer.


Qu'est-ce qui dit que la réponse est incorrecte? Qu'est-ce que trois vérifications asserqual?


Dans la question ci-dessus, ASSERT_COUT1 pour DOC2, DOC3, DOC4 s'attend à ce que l'Assertequal comptage.


Le premier paragraphe indique que les vérifications d'assises ont été supprimées, laissant uniquement la vérification indépendante. J'ai maintenant ajouté plus de détails pour expliquer cela.



0
votes
import inspect
import re
import unittest
import math

# Define below the class 'Circle' and it's methods with proper doctests.
class Circle:
    def __init__(self, radius):
        # Define the initialization method below
        try:
            if not isinstance(radius, (int, float)):
                raise TypeError 
            elif 1000 >=radius>=0:
                    self.radius=radius 
            else:
                raise ValueError        
        except ValueError:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        except TypeError:
            raise TypeError("radius must be a number")

    def area(self):
        # Define the area functionality below
        y=math.pi*(self.radius**2)
        return round(y,2)

    def circumference(self):
        # Define the circumference functionality below
        x=math.pi*2*self.radius
        return round(x,2)

class TestCircleCreation(unittest.TestCase):
    def test_creating_circle_with_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5 and check if 
        # the value of c1.radius equal to 2.5 or not
        c1 = Circle(2.5)        
        self.assertEqual(c1.radius, 2.5)

    def test_creating_circle_with_negative_radius(self):
        # Try Defining a circle 'c' with radius -2.5 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"
        c1 = Circle(2.5)        
        self.assertEqual(c1.radius, 2.5)

        with self.assertRaises(ValueError) as E:
            c = Circle(-2.5)     

    def test_creating_circle_with_greaterthan_radius(self):
        # Try Defining a circle 'c' with radius 1000.1 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"

        c1 = Circle(2.5)        
        self.assertEqual(c1.radius, 2.5)
        with self.assertRaises(ValueError) as E:
            c = Circle(1000.1)        

    def test_creating_circle_with_nonnumeric_radius(self):
        # Try Defining a circle 'c' with radius 'hello' and see 
        # if it raises a TypeError with the message
        # "radius must be a number"

        c1 = Circle(2.5)        
        self.assertEqual(c1.radius, 2.5)

        with self.assertRaises(TypeError) as E:
            c = Circle('hello')        

if __name__ == '__main__':
    fptr = open('output.txt', 'w')

    runner = unittest.TextTestRunner(fptr)

    unittest.main(testRunner=runner, exit=False)

    fptr.close()

    with open('output.txt') as fp:
        output_lines = fp.readlines()

    pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                     and line.endswith('.\n')]

    pass_count = pass_count[0]
    print(str(pass_count))

    doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
    doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
    doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
    doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)

    assert1_count = len(re.findall(r'assertEqual', doc1))

    print(str(assert1_count))

    assert1_count = len(re.findall(r'assertEqual', doc2))
    assert2_count = len(re.findall(r'assertRaises', doc2))
    print(str(assert1_count), str(assert2_count))

    assert1_count = len(re.findall(r'assertEqual', doc3))
    assert2_count = len(re.findall(r'assertRaises', doc3))
    print(str(assert1_count), str(assert2_count))

    assert1_count = len(re.findall(r'assertEqual', doc4))
    assert2_count = len(re.findall(r'assertRaises', doc4))
    print(str(assert1_count), str(assert2_count))

1 commentaires

Essayez ceci, vous obtiendrez 4 1 1,1 1,1 1,1



1
votes
import inspect
import re
import unittest
import math

class Circle:    
    def __init__(self, radius):
        # Define the initialization method below
        self.radius=radius
        if not isinstance(self.radius,(int,float)):
            raise TypeError("radius must be a number")
        elif(self.radius>1000 or self.radius<0):
            raise ValueError("radius must be between 0 and 1000 inclusive")
        else:
            pass
    def area(self):
        # Define the area functionality below
        return math.pi*(self.radius**2)
    def circumference(self):
        return 2*math.pi*self.radius
        # Define the circumference functionality below

class TestCircleCreation(unittest.TestCase):
    def test_creating_circle_with_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5 and check if 
        # the value of c1.radius equal to 2.5 or not
        c1=Circle(2.5)
        self.assertEqual(c1.radius,2.5)
       
    def test_creating_circle_with_negative_radius(self):
        # Try Defining a circle 'c' with radius -2.5 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"
        with self.assertRaises(ValueError) as e:
            c=Circle(-2.5)
        self.assertEqual(str(e.exception),"radius must be between 0 and 1000 inclusive")
        
    def test_creating_circle_with_greaterthan_radius(self):
        # Try Defining a circle 'c' with radius 1000.1 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"        
        with self.assertRaises(ValueError) as e:
            c=Circle(1000.1)
        self.assertEqual(str(e.exception),"radius must be between 0 and 1000 inclusive")
       
    def test_creating_circle_with_nonnumeric_radius(self):
        # Try Defining a circle 'c' with radius 'hello' and see 
        # if it raises a TypeError with the message
        # "radius must be a number"   
        with self.assertRaises(TypeError) as e:
            c=Circle("hello")
        self.assertEqual(str(e.exception),"radius must be a number")     

if __name__ == '__main__':
    fptr = open('output.txt', 'w')
    
    runner = unittest.TextTestRunner(fptr)
    
    unittest.main(testRunner=runner, exit=False)
    
    fptr.close()
    
    with open('output.txt') as fp:
        output_lines = fp.readlines()
    
    pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                     and line.endswith('.\n')]
    
    pass_count = pass_count[0]          
    print(str(pass_count))
                       
    doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
    doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
    doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
    doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)
    
    assert1_count = len(re.findall(r'assertEqual', doc1))
    print(str(assert1_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc2))
    assert2_count = len(re.findall(r'assertRaises', doc2))
    print(str(assert1_count), str(assert2_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc3))
    assert2_count = len(re.findall(r'assertRaises', doc3))
    print(str(assert1_count), str(assert2_count))
    
    assert1_count = len(re.findall(r'assertEqual', doc4))
    assert2_count = len(re.findall(r'assertRaises', doc4))
    print(str(assert1_count), str(assert2_count))

0 commentaires

1
votes
class Circle:
    def __init__(self, radius):
        # Define initialization method:
        self.radius = 0
        if not isinstance(radius,(int,float)):
            raise TypeError("radius must be a number")
        elif radius < 0 or radius > 1000:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        else:
            self.radius = radius
        
    def area(self):
        # Define area functionality:
        return round(math.pi*(self.radius**2),2)
               
    def circumference(self):
        # Define circumference functionality:
        return round(2*math.pi*self.radius)

class TestCircleCreation(unittest.TestCase):
    def test_creating_circle_with_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5, and check if 
        # the value of c1.radius is equal to 2.5 or not.
        c1 = Circle(2.5)
        self.assertEqual(c1.radius, 2.5)

    def test_creating_circle_with_negative_radius(self):
        # Define a circle 'c' with radius -2.5, and check 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive".
        with self.assertRaises(ValueError) as e:
            c = Circle(-2.5)
        self.assertEqual(str(e.exception),"radius must be between 0 and 1000 inclusive")
     
    def test_creating_circle_with_greaterthan_radius(self):
        # Define a circle 'c' with radius 1000.1, and check 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive".        
        with self.assertRaises(ValueError) as e:
            c = Circle(1000.1)
        self.assertEqual(str(e.exception),"radius must be between 0 and 1000 inclusive")      

    def test_creating_circle_with_nonnumeric_radius(self):
        # Define a circle 'c' with radius 'hello' and check 
        # if it raises a TypeError with the message
        # "radius must be a number".        
        with self.assertRaises(TypeError) as e:
            c = Circle("hello")
        self.assertEqual(str(e.exception), "radius must be a number")

0 commentaires