Bagaimana seorang insinyur QA menyelamatkan satu hari penuh dengan menghubungkan AutoTests di Visual Studio dan Uji IT

Alat kerja modern pengembang adalah selusin aplikasi yang berbeda: IDE, sistem pengujian, berbagai kerangka kerja, kontrol versi dan sistem kontainerisasi, aplikasi kantor, dan banyak lagi.

Dan seringkali kita, tanpa menyadarinya, menghabiskan waktu berharga mentransfer data dari satu sistem kerja ke sistem lainnya. Tetapi mengapa kita tidak melakukan optimalisasi alur kerja, bahkan dalam hal-hal kecil? Lima menit, dikalikan 5 kali sehari, akan memberi kita total lebih dari satu hari kerja per bulan, waktu yang dapat dihabiskan jauh lebih bermanfaat daripada kinerja pekerjaan rutin. Jadi kami sampai pada pembuatan ekstensi untuk Visual Studio, yang memungkinkan kami untuk mengotomatisasi proses membuat tes otomatis dalam sistem TI Uji kami.

Melanjutkan kisah webhooksdan bagaimana mereka membantu menghubungkan banyak layanan di tempat kerja, kami menyajikan kepada Anda kisah kami tentang cara membuat ekstensi untuk IDE kami yang berfungsi - Visual Studio. Selamat datang di kucing!

Artikel ini adalah posting tamu dari para pria di Test IT.



Chatbot yang dibahas dalam artikel sebelumnya tentu saja bagus, tetapi sejauh ini hanya berfungsi untuk memperoleh informasi tentang status autotest saat ini. Dan jika kita mengatur integrasi yang lebih ketat dengan sistem IT Uji, kita dapat memperluas daftar tes proyek saat ini di portal secara otomatis, tanpa perlu menambahkannya secara manual.

Sebelumnya, untuk ini kami menggunakan pustaka tergesa-gesa dan aplikasi konsol yang, pada saat startup, melihat solusi saat ini, menemukan proyek pengujian, mengekstraksi daftar autotest dari perakitannya, dan mengirimkannya ke API kami. Tampaknya Anda dapat membiarkannya seperti itu, karena solusinya bekerja. Tapi terus-menerus menunda-nunda seluruh proyek (bahkan jika itu adalah salah satu metode yang secara tidak sinkron menyebut perpustakaan) sangat sulit, dan ketergantungan abadi proyek di antara mereka sendiri juga bukan pertanda selera yang baik.

Jadi kami sampai pada pembuatan ekstensi untuk Visual Studio, dan sekarang kami akan menceritakan sedikit tentang bagaimana kami membuatnya.

Sisi teknis


Kami secara alami akan mengembangkan ekstensi dalam Visual Studio itu sendiri. Bagaimanapun, tidak ada yang tahu tentang IDE sebanyak IDE itu sendiri. Pertama, pastikan bahwa Visual Studio memiliki semua komponen yang diperlukan untuk membuat ekstensi. Kami menemukan dan meluncurkan Penginstal Visual Studio dan memeriksa modul "Pengembangan Ekstensi Visual Studio":



Satu pemeriksaan cukup bagi kami untuk menginstal semua pustaka yang diperlukan untuk bekerja. Informasi tentang pemasangan untuk pengembangan ekstensi Visual Studio harus kira-kira situasi berikut: Bagian



persiapan selesai, kita dapat melanjutkan untuk membuat proyek baru dan membenamkan diri dalam arsitektur dan struktur template ekstensi.

Kami akan memperluas ekstensi baru dengan menemukan daftar solusi yang tersedia menggunakan frasa "VSIX" dan memilih Proyek VSIX (C #, tentu saja):



Setelah penyebaran, pada awalnya kita bertemu dengan arsitektur sederhana dari template ekstensi:



Dalam contoh ini, source.extension.vsixmanifest adalah manifest umum yang menggambarkan properti dasar ekstensi, seperti nama produk, penulis, versi, deskripsi, ikon ekstensi, versi target IDE dan banyak lagi. Omong-omong, properti-properti inilah yang dilihat di toko ekstensi dan di penginstal ekstensi Visual Studio.

VSIXProject3Package.cs (mask: {ProjectName} Package.cs), pada gilirannya, adalah kelas initializer yang mendaftarkan semua perintah dan skema sumber daya yang tersedia. Kami akan mengenal tim sekarang.

Mari kita buat tim baru yang akan membuka jendela WPF dengan parameter ekstensi: kita perlu menyimpan data tentang proyek target, lokasi dan nama rakitannya, koneksi ke server dan informasi lain di suatu tempat.

Kami mencari elemen baru, yang disebut Command yang cukup logis .



Banyak yang mungkin bertanya-tanya: mengapa kita menggunakan Command ketika Async Tool Window dan Tool Window cocok untuk deskripsi tugas, sesuai dengan namanya? Semuanya cukup sederhana: saat membuat dua elemen ini, kita akan menggunakan file markup ke xaml, file cs dengan nama yang sama, dan juga sebuah perintah. Semuanya akan baik-baik saja, seperti yang kita butuhkan, tetapi dalam hal ini Tool Window (tidak masalah jika asynchronous) menggunakan templat jendela yang terintegrasi ke dalam Visual Studio itu sendiri. Pada output, kita mendapatkan salah satu jendela, yang diperluas secara default, bukan jendela Debug. Tentu saja, semua ini dapat disesuaikan, tetapi kita membutuhkan jendela pihak ketiga. Itu sebabnya kami tidak menggunakan Jendela Alat, tetapi menambahkan jendela WPF biasa.

Saya pikir rincian membuat jendela baru dengan elemen standar dapat dihilangkan, karena membosankan, tidak menarik dan lemah terkait dengan judul artikel. Satu-satunya rekomendasi yang dapat Anda tinggalkan di sini: Visual Studio, ketika menambahkan elemen baru, tidak akan menampilkan jendela WPF dalam daftar opsi, jadi opsi tercepat dan termudah adalah membuat jendela seperti itu secara terpisah dari proyek ekstensi dan kemudian mentransfernya ke proyek saat ini (jangan lupa untuk memperbaiki ruang) nama).



Jadi, setelah membuat tim baru, yang kami sebut OpenSettingsCommand, pembuatan kode studio yang legendaris menciptakan kelas tim dan file format vsct yang menyimpan markup ekstensi kami dan pemetaan perintah dan tombol-tombol yang memanggil mereka. Sangat diinginkan untuk menulis ulang markup pada implementasi Anda sendiri: dibuat secara otomatis, itu akan menempatkan elemen Anda di menu "Extensions". Dalam hal ini, kami menulis ulang markup ini dengan membuat grup yang terdiri dari dua tim dan menempatkannya langsung di toolbar. Contoh dari perintah dan markup dapat ditemukan di repositori kami .

Di kelas yang dibuat, kita bisa melihat metode Execute, yang dengannya semuanya dimulai ketika perintah ini dipanggil. Sebenarnya, di sinilah kita akan mendaftarkan inisialisasi jendela WPF baru.

Envdte


Dan kami dengan lancar mendekati penggunaan Visual Studio SDK, yaitu, perpustakaan EnvDTE. Pustaka COM ini memungkinkan kita untuk bekerja dengan objek dan elemen Visual Studio: mendapatkan daftar solusi dan proyek aktif, bekerja dengan penyorotan sintaks, jendela aktif, membaca kode proyek dan banyak lagi. Bahkan, jika Anda terjun ke dokumentasi perpustakaan ini, Anda dapat menemukan sendiri banyak fungsi yang bermanfaat. Dalam contoh ini, kami menggunakannya tepat untuk mendapatkan daftar proyek dalam solusi aktif.

Meskipun basis kode kecil gratis, kami hanya memerlukan beberapa baris kode untuk mendapatkan daftar proyek dalam solusi aktif:

ThreadHelper.ThrowIfNotOnUIThread();
var activeVS = (DTE)Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.GetService(typeof(DTE))
 ?? throw new InvalidOperationException("DTE not found");
var activeProjects = new List<Project>();
activeProjects.AddRange(activeVS.Solution.Projects.Cast<Project>());
//  , activeProjects         

Dengan mudah dan alami kita dapat mengumpulkan informasi terperinci tentang semua proyek aktif.

Ambil dari daftar ini nama proyek (properti Name) dan path ke file csproj (tiba-tiba, FullName): ini cukup bagi kami untuk menanyakan pengguna proyek yang diinginkan dari daftar yang mungkin dan memetakannya ke direktori untuk mencari majelis.

Langkah selanjutnya adalah menghubungkan perpustakaan, yang tugasnya adalah menganalisis perakitan, mengumpulkan autotest dan menerbitkannya di portal Uji IT. Kami akan menghilangkan detail pembuatan perpustakaan, tetapi kami akan memberikan kelas yang menarik yang bisa mendapatkan daftar uji otomatis dari rakitan yang dimuat:

public class AutotestsService
    {
        public IList<AutotestModel> GetAutotestsFromAssembly<TTestClassAttribute, TTestMethodAttribute>(Assembly assembly, Guid projectId, string repositoryLink)
            where TTestClassAttribute : Attribute
            where TTestMethodAttribute : Attribute
        {
            MethodInfo[] testMethods = GetAutotestFromAssembly<TTestClassAttribute, TTestMethodAttribute>(assembly);

            List<AutotestModel> allModels = new List<AutotestModel>();
            foreach (MethodInfo method in testMethods)
            {
                AutotestModel autotest = new AutotestModel()
                {
                    ExternalId = method.Name,
                    LinkToRepository = repositoryLink,
                    ProjectId = projectId,
                    Name = GetAutotestName(method.Name),
                    Classname = method.DeclaringType.Name,
                    Namespace = GetAutotestNamespace(method)
                };

                allModels.Add(autotest);
            }

            return allModels;
        }

        private static MethodInfo[] GetAutotestFromAssembly<TTestClassAttribute, TTestMethodAttribute>(Assembly assembly)
            where TTestClassAttribute : Attribute
            where TTestMethodAttribute : Attribute
        {
            return assembly.GetTypes()
                .Where(c => c.IsDefined(typeof(TTestClassAttribute)))
                .SelectMany(t => t.GetMethods())
                .Where(m => m.IsDefined(typeof(TTestMethodAttribute)))
                .ToArray();
        }

        private string GetAutotestName(string autotestExternalId)
        {
            StringBuilder autotestName = new StringBuilder();

            for (int i = 0; i < autotestExternalId.Length; i++)
            {
                if (char.IsUpper(autotestExternalId[i]) && i != 0)
                    autotestName.Append(' ');
                autotestName.Append(autotestExternalId[i]);
            }

            return autotestName.ToString();
        }

        private string GetAutotestNamespace(MethodInfo testMethod)
        {
            return testMethod.DeclaringType.FullName
                .Replace($".{testMethod.DeclaringType.Name}", string.Empty);
        }
    }

Seluruh kode sumber pustaka selalu dapat dilihat di repositori kami .

Jadi, kembali ke ekstensi. Untuk memulai logika pustaka kami, Anda perlu menambahkan perintah baru, dalam metode Jalankan yang kami tulis panggilan pustaka, berikan atribut kelas dan metode pengujian, serta parameter ekstensi yang disimpan:

var settings = Properties.Settings.Default;
var executor = new LinkExecutor();
await executor.Execute<TestClassAttribute, TestMethodAttribute>(
    settings.Domain,
    settings.SecretKey,
    settings.ProjectNameInTestIT,
    settings.RepositoryLink ?? string.Empty,
    settings.AssemblyPath,
    Logger);

Catatan penting: Kami melewatkan logger ke perpustakaan untuk dapat menulis informasi teknis langsung ke jendela output pesan Visual Studio. Perpustakaan tidak hanya terikat dengan IDE ini, penting bagi kita untuk meninggalkan kesempatan untuk menggunakannya dalam situasi apa pun.

hasil


Akibatnya, setelah pengembangan, kami mendapat sesuatu seperti ekstensi ini:



. , Visual Studio, , Visual Studio Visual Studio Visual Studio Visual Studio. , .



Mari kita buka contoh solusi yang berisi proyek dengan unit test, dan uji ekstensi kita di atasnya. Saat memuat proyek, kami dapat segera melihat tombol baru di panel:



Segera ambil kunci API rahasia dari akun pribadi Anda dan siapkan proyek baru di platform kami:





Selanjutnya, mari kembali ke ekstensi. Mari kita buka jendela kita dengan parameter ekstensi dan mengisi bidang:



Kami melewati daftar proyek saat ini ke perancang jendela, silakan disediakan oleh perpustakaan Visual Studio SDK, dan kami memuat opsi "Proyek dll" setelah memilih proyek: layanan mencari semua file dll dalam perakitan proyek "UnitTestProject ”Dan menunjukkan kepada kami kemungkinan opsi perpustakaan. Kami menyimpan pengaturan dan menjalankan fungsi utama ekstensi kami.

Di jendela output, setelah beberapa detik, kita melihat yang berikut:



Siapa yang peduli bagaimana kami membuat output dari pesan - kode sumber dari logger dapat ditemukan di sini .

Dalam contoh kami, ada 3 tes Unit dan 3 tes integrasi. Kedengarannya seperti kebenaran. Periksa apakah ada portal:



Kesimpulan


Hari ini kami memeriksa dasar-dasar membuat ekstensi untuk Visual Studio menggunakan contoh ekstensi untuk menerbitkan daftar autotest pada platform Uji TI. Opsi ekstensi hanya dibatasi oleh imajinasi Anda: Anda dapat menerapkan obrolan dengan tim, Anda dapat membuat pemberitahuan jika terjadi kerusakan proyek di cabang Anda, Anda bahkan dapat, seperti dalam fantasi kami tentang Kerangka Bot , menambahkan tombol pesanan pizza ke kantor.

Bermimpilah, ciptakan, hemat waktu dan selalu tetap spesialis kreatif!

tentang Penulis



Mikhail Pirogovsky adalah pengembang .NET. Materi ini ditulis dengan tim Uji TI. Di grup kami di Facebook, kami berbicara tentang bekerja di QA, pengujian, alat, dan lainnya.

All Articles