Test Gezgini'ne kullanarak test temelli geliştirmeyi kullanmaya başlama

Artımlı kod değişiklikleriyle kodunuzun düzgün çalışmasını sağlamaya yardımcı olmak için birim testleri oluşturun. Üçüncü taraflar tarafından geliştirilenler de dahil olmak üzere birim testleri yazmak için kullanabileceğiniz çeşitli çerçeveler vardır. Bazı test çerçeveleri farklı dillerde veya platformlarda test için özel olarak tasarlanmıştır. Test Gezgini, bu çerçevelerden herhangi birinde birim testleri için tek bir arabirim sağlar. Test Gezgini hakkında daha fazla bilgi için bkz. Test Gezgini ile birim testleri çalıştırma ve Test Gezgini hakkında SSS.

Bu makalede, Microsoft Test Framework (MSTest) kullanarak C# dilinde test edilmiş bir yöntem geliştirme adımları gösterilmektedir. NUnit gibi diğer diller veya diğer test çerçeveleri için kolayca uyarlayabilirsiniz. Daha fazla bilgi için bkz. üçüncü taraf birim test çerçevelerini yükleme.

Test oluşturma ve kod oluşturma

  1. .NET veya .NET Standard için bir C# Sınıf Kitaplığı projesi oluşturun. Bu proje, test etmek istediğimiz kodu içerir. Projeye MyMath adını verin.

  2. Aynı çözümde .NET için yeni bir MSTest test projesi ekleyin.

    Visual Studio 2019 sürüm 16.9'da, MSTest proje şablonu adı Birim Testi Projesi'dir.

    Test projesine MathTests adını verin.

    Yeni kod ve test projeleri

  3. Test projesinde, belirli bir giriş için elde edilen sonucu doğrulayan basit bir test yöntemi yazın. Aşağıdaki kodu Test1 veya UnitTest1 sınıfına ekleyin.

    [TestMethod]
    public void BasicRooterTest()
    {
      // Create an instance to test:
      Rooter rooter = new Rooter();
      // Define a test input and output value:
      double expectedResult = 2.0;
      double input = expectedResult * expectedResult;
      // Run the method under test:
      double actualResult = rooter.SquareRoot(input);
      // Verify the result:
      Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100);
    }
    
  4. Test kodundan bir tür oluşturun.

    1. İmleci üzerine Rootergetirin ve ampul menüsünü açın.

      Yeni tür oluştur'u seçin.

      Yeni tür hızlı eylemi oluşturma

    2. Tür Oluştur iletişim kutusunda, Project'i sınıf kitaplığı projesi olan MyMath olarak ayarlayın ve tamam'ı seçin.

      Visual Studio 2019'da Tür Oluştur iletişim kutusu

  5. Test kodundan bir yöntem oluşturun. İmleci üzerine SquareRootgetirin ve ampul menüsünden Generate method 'SquareRoot' veya Generate method 'Rooter.SquareRoot' öğesini seçin.

  6. Birim testini çalıştırın.

    1. Test Gezgini'ne gidin.

      Test menüsünden Test Gezgini'ni açmak için Test Gezgini'ni seçin.

    2. Testi çalıştırmak için Test Gezgini'ndeTümünü Çalıştır düğmesini seçin.

    Çözüm derlenip test çalıştırılır ve başarısız olur.

  7. Testin adını seçin.

    Testin ayrıntıları Test Ayrıntı Özeti bölmesinde görünür.

    Test Gezgini'nde Test Ayrıntısı Özeti

  8. Testin başarısız olduğu konuma atlamak için Yığın İzleme'nin altındaki üst bağlantıyı seçin.

Bu noktada, testin geçmesi için değiştirebileceğiniz bir test ve saplama oluşturdunuz.

Kod değişikliğini doğrulama

  1. Class1.cs dosyasında kodunu geliştirinSquareRoot:

    public double SquareRoot(double input)
    {
        return input / 2;
    }
    
  2. Test Gezgini'ndeTümünü Çalıştır'ı seçin.

    Çözüm derlenip test çalıştırılır ve geçer.

    Geçiş testlerini gösteren Test Gezgini

Giriş aralığını genişletme

Kodun her durumda çalıştığına olan güvenimizi artırmak için, daha geniş bir giriş değerleri aralığı deneyen testler ekleyin.

Tavsiye

Geçen mevcut testleri değiştirmekten kaçının. Bunun yerine yeni testler ekleyin. Mevcut testleri yalnızca kullanıcı gereksinimleri değiştiğinde değiştirin. Bu ilke, kodu genişletmek için çalışırken mevcut işlevselliği kaybetmediğinizden emin olmanıza yardımcı olur.

  1. Test sınıfına, bir dizi giriş değeri deneyen aşağıdaki testi ekleyin:

    [TestMethod]
    public void RooterValueRange()
    {
        // Create an instance to test.
        Rooter rooter = new Rooter();
    
        // Try a range of values.
        for (double expected = 1e-8; expected < 1e+8; expected *= 3.2)
        {
            RooterOneValue(rooter, expected);
        }
    }
    
    private void RooterOneValue(Rooter rooter, double expectedResult)
    {
        double input = expectedResult * expectedResult;
        double actualResult = rooter.SquareRoot(input);
        Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000);
    }
    
  2. Test Gezgini'ndeTümünü Çalıştır'ı seçin.

    Yeni test başarısız olur (ilk test yine de geçer). Hata noktasını bulmak için başarısız olan testi seçin ve ardından Test Ayrıntı Özeti bölmesindeki ayrıntılara bakın.

  3. Neyin yanlış olabileceğini görmek için test altındaki yöntemi inceleyin. SquareRoot Kodu aşağıdaki gibi değiştirin:

    public double SquareRoot(double input)
    {
      double result = input;
      double previousResult = -input;
      while (Math.Abs(previousResult - result) > result / 1000)
      {
        previousResult = result;
        result = result - (result * result - input) / (2 * result);
      }
      return result;
    }
    
  4. Test Gezgini'ndeTümünü Çalıştır'ı seçin.

    Artık her iki test de geçti.

Olağanüstü durumlar için test ekleme

  1. Negatif girişler için yeni bir test ekleyin:

    [TestMethod]
    public void RooterTestNegativeInput()
    {
        Rooter rooter = new Rooter();
        Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1));
    }
    
  2. Test Gezgini'ndeTümünü Çalıştır'ı seçin.

    Yeni test başarısız oluyor.

    Test döngüleri altındaki yöntemse, Test Gezgini'nin araç çubuğunda İptal'i seçin. Test yürütmeyi durdurur ve başarısız olur.

  3. Yönteminin SquareRoot başına aşağıdaki if deyimi ekleyerek kodu düzeltin:

    public double SquareRoot(double input)
    {
        if (input <= 0.0)
        {
            throw new ArgumentOutOfRangeException();
        }
        ...
    
  4. Test Gezgini'ndeTümünü Çalıştır'ı seçin.

    Tüm testler geçer.

Test altındaki kodu yeniden düzenleme

Kodu yeniden düzenleme, ancak testleri değiştirme.

Tavsiye

Yeniden düzenleme, kodun daha iyi veya daha kolay anlaşılmasını sağlamayı amaçlayan bir değişikliktir. Kodun davranışını değiştirmek için tasarlanmamıştır ve bu nedenle testler değiştirilmez.

Yeniden düzenleme adımlarını işlevselliği genişleten adımlardan ayrı olarak gerçekleştirmenizi öneririz. Testleri değiştirmeden tutmak, yeniden düzenleme sırasında yanlışlıkla hata vermediğiniz konusunda size güven verir.

  1. yönteminde result hesaplayan SquareRoot satırı aşağıdaki gibi değiştirin:

    public double SquareRoot(double input)
    {
        if (input <= 0.0)
        {
            throw new ArgumentOutOfRangeException();
        }
    
        double result = input;
        double previousResult = -input;
        while (Math.Abs(previousResult - result) > result / 1000)
        {
            previousResult = result;
            result = (result + input / result) / 2;
            //was: result = result - (result * result - input) / (2*result);
        }
        return result;
    }
    
  2. Tümünü Çalıştır'ı seçin ve tüm testlerin yine de geçtiğini doğrulayın.

    3 başarılı testi gösteren Test Gezgini