Bagikan melalui


Ringkasan Microsoft IntelliTest

IntelliTest memungkinkan Anda menemukan bug lebih awal, dan mengurangi biaya pemeliharaan pengujian. Dengan menggunakan pendekatan pengujian terautomasi dan transparan, IntelliTest dapat membuat rangkaian kandidat pengujian untuk kode .NET Anda. Pembuatan rangkaian pengujian dapat dipandu lebih lanjut oleh properti ketepatan yang Anda tentukan. IntelliTest bahkan akan mengembangkan rangkaian pengujian secara otomatis seiring berkembangnya kode dalam pengujian.

Catatan

IntelliTest hanya tersedia dalam edisi Enterprise. Ini didukung untuk kode C# yang menargetkan .NET Framework. Untuk dukungan .NET 6 dengan IntelliTest, instal versi Pratinjau Visual Studio Enterprise dan lihat pengumuman .

Uji karakterisasi IntelliTest memungkinkan Anda menentukan perilaku kode dalam hal rangkaian pengujian unit tradisional. Rangkaian pengujian demikian dapat digunakan sebagai rangkaian regresi, membentuk dasar untuk mengatasi kompleksitas yang terkait dengan pemfaktoran ulang kode lama atau tidak dikenal.

Pembuatan masukan pengugjian terpandu IntelliTest menggunakan analisis kode terbuka dan pendekatan pemecahan masalah batasan untuk secara otomatis membuat nilai masukan pengujian yang tepat; biasanya tanpa perlu intervensi pengguna. Untuk jenis objek yang kompleks, IntelliTest secara otomatis membuat pabrik. Anda dapat memandu pembuatan masukan pengujian dengan memperluas dan mengonfigurasi pabrik agar sesuai dengan kebutuhan Anda. Properti kebenaran yang ditentukan sebagai pernyataan dalam kode digunakan secara otomatis untuk memandu pembuatan input pengujian lebih lanjut.

Integrasi IDE IntelliTest sepenuhnya terintegrasi ke dalam IDE Visual Studio. Semua informasi yang dikumpulkan selama pembuatan rangkaian pengujian (seperti masukan yang dihasilkan secara otomatis, output dari kode Anda, kasus pengujian yang dibuat, dan status lulus atau gagalnya) muncul dalam IDE Visual Studio. Anda dapat dengan mudah mengulangi antara memperbaiki kode Anda dan menjalankan ulang IntelliTest, tanpa meninggalkan IDE Visual Studio. Pengujian dapat disimpan ke dalam solusi sebagai Proyek Pengujian Unit, dan secara otomatis terdeteksi setelah itu oleh Visual Studio Test Explorer.

Melengkapi praktik pengujian yang sudah ada Gunakan IntelliTest untuk melengkapi praktik pengujian yang sudah ada yang mungkin sudah Anda ikuti.

Jika Anda ingin menguji:

  • Algoritma atas data primitif, atau array data primitif:
  • Algoritma atas data kompleks, seperti pengkompilasi:
    • biarkan IntelliTest terlebih dahulu membuat representasi abstrak data, dan kemudian mengumpankannya ke algoritma
    • biarkan IntelliTest membangun instans menggunakan pembuatan objek kustom dan invarian data, dan kemudian memanggil algoritma
  • Kontainer data:
  • Basis kode yang ada:

Halo Dunia IntelliTest

IntelliTest menemukan masukan yang relevan dengan program yang diuji, yang berarti Anda dapat menggunakannya untuk membuat string Halo Dunia! yang terkenal. Ini mengasumsikan bahwa Anda telah membuat proyek pengujian berbasis C# MSTest dan menambahkan referensi ke Microsoft.Pex.Framework. Jika Anda menggunakan kerangka kerja pengujian yang berbeda, buat pustaka kelas C# dan lihat dokumentasi kerangka kerja pengujian tentang cara menyiapkan proyek.

Contoh berikut membuat dua batasan pada parameter bernama nilai sehingga IntelliTest menghasilkan string yang diperlukan:

using System;
using Microsoft.Pex.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public partial class HelloWorldTest {
    [PexMethod]
    public void HelloWorld([PexAssumeNotNull]string value) {
        if (value.StartsWith("Hello")
            && value.EndsWith("World!")
            && value.Contains(" "))
            throw new Exception("found it!");
    }
}

Setelah dikompilasi dan dijalankan, IntelliTest membuat serangkaian pengujian seperti rangkaian berikut:

  1. ""
  2. "\0\0\0\0\0"
  3. "Halo"
  4. "\0\0\0\0\0\0"
  5. "Hello\0"
  6. "Hello\0\0"
  7. "Hello\0World!"
  8. "Halo Dunia!"

Catatan

Untuk masalah build, coba ganti referensi Microsoft.VisualStudio.TestPlatform.TestFramework dan Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions dengan referensi ke Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Baca Membuat pengujian unit dengan IntelliTest untuk memahami di mana pengujian yang dibuat disimpan. Kode pengujian yang dibuat harus menyertakan pengujian seperti kode berikut:

[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
    this.HelloWorld("Hello World!");
}

Semudah itu!

Sumber daya tambahan:

Atribut penting

using Microsoft.Pex.Framework;

[..., PexClass(typeof(Foo))]
public partial class FooTest {
    [PexMethod]
    public void Bar([PexAssumeNotNull]Foo target, int i) {
        target.Bar(i);
    }
}
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]

Kelas pembantu statis penting

  • PexAssume mengevaluasi asumsi (pemfilteran masukan)
  • PexAssert mengevaluasi penegasan
  • PexChoose membuat pilihan baru (masukan tambahan)
  • PexObserve mencatat nilai langsung ke pengujian yang dibuat
[PexMethod]
void StaticHelpers(Foo target) {
    PexAssume.IsNotNull(target);

    int i = PexChoose.Value<int>("i");
    string result = target.Bar(i);

    PexObserve.ValueForViewing<string>("result", result);
    PexAssert.IsNotNull(result);
}

Batasan

Bagian ini menjelaskan batasan IntelliTest:

Nondeterminisme

IntelliTest mengasumsikan bahwa program yang dianalisis bersifat deterministik. Jika tidak, IntelliTest bersepeda hingga mencapai batas eksplorasi.

IntelliTest menganggap program tidak determistik jika bergantung pada input yang tidak dapat dikontrol IntelliTest.

IntelliTest mengontrol masukan yang diberikan ke pengujian unit berparameter dan diperoleh dari PexChoose. Dalam hal ini, hasil panggilan ke kode yang tidak dikelola atau tidak terinstrumentasi juga dianggap sebagai "input" ke program berinstrumen, tetapi IntelliTest tidak dapat mengontrolnya. Jika alur kontrol program bergantung pada nilai tertentu yang berasal dari sumber eksternal ini, IntelliTest tidak dapat "mengarahkan" program menuju area yang sebelumnya belum ditemukan.

Selain itu, program ini dianggap tidak determistik jika nilai dari sumber eksternal berubah saat menjalankan ulang program. Dalam kasus demikian IntelliTest kehilangan kontrol atas eksekusi program dan pencariannya menjadi tidak efisien.

Kadang-kadang tidak jelas ketika ini terjadi. Perhatikan contoh berikut:

  • Hasil metode GetHashCode() disediakan oleh kode yang tidak dikelola, dan tidak dapat diprediksi.
  • Kelas System.Random menggunakan waktu sistem saat ini untuk memberikan nilai yang benar-benar acak.
  • Kelas System.DateTime menyediakan waktu saat ini, yang tidak berada di bawah kendali IntelliTest.

Konkurensi

IntelliTest tidak menangani program multithreaded.

Kode native

IntelliTest tidak memahami kode asli, seperti instruksi x86 yang dipanggil melalui P/Invoke. IntelliTest tidak tahu cara menerjemahkan panggilan tersebut menjadi batasan yang dapat diteruskan ke pemecah masalah batasan. Bahkan untuk kode .NET, IntelliTest hanya dapat menganalisis kode yang dilengkapinya. IntelliTest tidak dapat melengkapi bagian tertentu dari mscorlib, termasuk pustaka pantulan. DynamicMethod tidak dapat diinstrumentasikan.

Solusi yang disarankan adalah mengadakan mode pengujian di mana metode tersebut terletak dalam jenis dalam rakitan dinamis. Namun, bahkan jika beberapa metode tidak terinstrumentasi, IntelliTest mencoba menutupi sebanyak mungkin kode berinstrumen.

Platform

IntelliTest hanya didukung di X86, 32-bit . NETframework.

Bahasa

Pada prinsipnya, IntelliTest dapat menganalisis program .NET arbitrer, yang ditulis dalam bahasa .NET apa pun. Akan tetapi, di Visual Studio IntelliTest hanya mendukung C#.

Penalaran simbolis

IntelliTest menggunakan pemecah masalah batasan otomatis untuk menentukan nilai mana yang relevan untuk pengujian dan program yang sedang diuji. Akan tetapi, kemampuan pemecah masalah batasan adalah, dan selalu akan, terbatas.

Jejak tumpukan salah

Karena IntelliTest menangkap dan "memunculkan kembali" pengecualian dalam setiap metode berinstrumen, nomor baris dalam jejak tumpukan tidak akan benar. Ini adalah batasan berdasarkan desain petunjuk "rethrow".