كيف أنقذ مهندس ضمان الجودة يومًا كاملاً من خلال ربط الاختبارات التلقائية في Visual Studio واختبار تقنية المعلومات

أدوات العمل الحديثة للمطور هي عشرات التطبيقات المختلفة: IDE ، ونظام اختبار ، وأطر عمل مختلفة ، وأنظمة التحكم في الإصدار والحاويات ، والتطبيقات المكتبية ، وأكثر من ذلك بكثير.

وغالبًا ما نقضي وقتًا ثمينًا في نقل البيانات من نظام عمل إلى آخر دون أن نلاحظ ذلك. ولكن لماذا لا نتعامل مع تحسين سير العمل ، حتى في الأشياء الصغيرة؟ خمس دقائق ، مضروبة في 5 مرات في اليوم ، ستمنحنا ما مجموعه أكثر من يوم عمل واحد في الشهر ، وهو الوقت الذي يمكن أن نقضيه أكثر فائدة من أداء العمل الروتيني. لذا توصلنا إلى إنشاء ملحق لـ Visual Studio ، والذي يسمح لنا بأتمتة عملية إنشاء اختبارات تلقائية في نظام اختبار تكنولوجيا المعلومات لدينا.

استمرار قصة الخطافاتوكيف تساعد على ربط العديد من الخدمات في العمل ، نقدم لك قصتنا حول إنشاء ملحق IDE للعمل - Visual Studio. مرحبًا بك في القط!

هذه المقالة هي مشاركة ضيف من الرجال في اختبار تكنولوجيا المعلومات.



إن روبوت الدردشة الذي تمت مناقشته في المقالة السابقة ، بالطبع ، جيد ، ولكنه حتى الآن يخدمنا فقط للحصول على معلومات حول الوضع الحالي للتجارب الذاتية. وإذا قمنا بإعداد تكامل أكثر إحكامًا مع نظام اختبار تكنولوجيا المعلومات ، فيمكننا توسيع قائمة اختبارات المشروع الحالي على البوابة الإلكترونية تلقائيًا ، دون الحاجة إلى إضافتها يدويًا.

في السابق ، لهذا استخدمنا مكتبة تم نشرها على عجل وتطبيق وحدة تحكم ، عند بدء التشغيل ، نظر في الحل الحالي ، وعثر على مشروع تجريبي ، واستخرج قائمة الاختبارات التلقائية من تجميعه ، وأرسلها إلى API لدينا. يبدو أنه يمكنك تركها بهذه الطريقة ، لأن الحل يعمل. لكن المماطلة المستمرة لمشروع بأكمله (حتى لو كانت إحدى الطرق التي تستدعي المكتبة بشكل غير متزامن) أمر صعب للغاية ، كما أن التبعيات الأبدية للمشاريع فيما بينها ليست علامة على الذوق السليم.

لذلك جئنا إلى إنشاء ملحق Visual Studio ، والآن سنخبرنا قليلاً عن كيفية إنشائه.

الجانب الفني


سنقوم بطبيعة الحال بتطوير الامتداد في Visual Studio نفسه. بعد كل شيء ، لا أحد يعرف عن IDE مثل IDE نفسه. أولاً ، تأكد من أن Visual Studio يحتوي على جميع المكونات اللازمة لإنشاء الملحقات. نجد برنامج Visual Studio Installer ونطلقه ونتحقق من الوحدة النمطية "تطوير ملحقات Visual Studio":



يكفي فحص واحد لتثبيت جميع المكتبات اللازمة للعمل. يجب أن تكون المعلومات حول التثبيت لتطوير ملحقات Visual Studio هي الحالة التالية تقريبًا: انتهى



الجزء التحضيري ، يمكننا المضي قدمًا في إنشاء مشروع جديد والانغماس في بنية وهيكل قالب الامتداد.

سنقوم بتوسيع الامتداد الجديد من خلال إيجاد قائمة الحلول المتاحة باستخدام عبارة "VSIX" واختيار مشروع VSIX (C # ، بالطبع):



بعد النشر ، تقابلنا للوهلة الأولى



ببناء قالب الامتداد البسيط: في هذا المثال ، source.extension.vsixmanifest هو بيان شائع يصف الخصائص الأساسية للإضافة ، مثل اسم المنتج ، المؤلف ، الإصدار ، الوصف ، رمز الامتداد ، الإصدار المستهدف لـ IDE واشياء أخرى عديدة. بالمناسبة ، هذه الخصائص هي التي يتم عرضها في كل من متجر الملحقات وفي مثبت ملحق Visual Studio.

VSIXProject3Package.cs (القناع: {ProjectName} Package.cs) ، بدوره ، هو فئة مُهيئ يسجل جميع الأوامر ومخططات الموارد المتاحة. سنتعرف على الفرق الآن.

دعنا ننشئ فريقًا جديدًا يفتح نافذة WPF مع معلمات الامتداد: نحتاج إلى تخزين البيانات حول المشروع المستهدف وموقع واسم تجميعه والاتصال بالخادم ومعلومات أخرى في مكان ما.

نحن نبحث عن عنصر جديد يسمى الأمر المنطقي تمامًا .



قد يتساءل الكثيرون: لماذا نستخدم Command عندما تكون نافذة أداة Async ونافذة الأداة مناسبة لوصف المهمة ، وفقًا للاسم؟ كل شيء بسيط للغاية: عند إنشاء هذين العنصرين ، سننشر ملف ترميز إلى xaml ، وملف cs بنفس الاسم ، وأيضًا أمر. سيكون كل شيء على ما يرام ، كما نحتاج إليه ، ولكن في هذه الحالة ، تنشر نافذة الأدوات (بغض النظر عما إذا كانت غير متزامنة) قالب نافذة يتكامل مع Visual Studio نفسه. عند الإخراج ، نحصل على إحدى النوافذ ، والتي يتم توسيعها افتراضيًا بدلاً من نافذة التصحيح. بالطبع ، كل هذا قابل للتخصيص ، لكننا بحاجة إلى نافذة خارجية. هذا هو السبب في أننا لا نستخدم نافذة الأدوات ، ولكن نضيف نافذة WPF عادية.

أعتقد أن تفاصيل إنشاء نافذة جديدة بعناصر قياسية يمكن حذفها ، لأنها مملة وغير مثيرة للاهتمام وذات صلة ضعيفة بعنوان المقالة. التوصية الوحيدة التي يمكنك تركها هنا: Visual Studio عند إضافة عنصر جديد لن يعرض لك نافذة WPF في قائمة الخيارات ، لذا فإن الخيار الأسرع والأسهل هو إنشاء مثل هذه النافذة بشكل منفصل عن مشروع الإضافة ثم نقلها إلى المشروع الحالي (لا تنس إصلاح المساحة الأسماء).



لذا ، بعد إنشاء فريق جديد ، والذي أطلقنا عليه اسم OpenSettingsCommand ، يقوم إنشاء كود الاستوديو الأسطوري بإنشاء فئة فريق وملف بتنسيق vsct يقوم بتخزين كل من ترميز الامتداد الخاص بنا وتعيين الأوامر والأزرار التي تستدعيهم. من المستحسن للغاية إعادة كتابة الترميز على التنفيذ الخاص بك: يتم إنشاؤه تلقائيًا ، وسوف يضع العناصر الخاصة بك في قائمة "الإضافات". في هذه الحالة ، نعيد كتابة هذا الترميز من خلال إنشاء مجموعة من فريقين ووضعها مباشرة على شريط الأدوات. يمكن العثور على مثال للأمر والترميز في مستودعنا .

في الصف الذي تم إنشاؤه ، يمكننا ملاحظة طريقة التنفيذ ، التي يبدأ بها كل شيء عند استدعاء هذا الأمر. في الواقع ، سنقوم هنا بتسجيل تهيئة نافذة WPF الجديدة.

Envdte


وقد اقتربنا بسلاسة من استخدام Visual Studio SDK ، أي مكتبة EnvDTE. تسمح لنا مكتبة COM هذه بالعمل مع كائنات وعناصر Visual Studio: الحصول على قائمة بالحلول والمشاريع النشطة ، والعمل مع تمييز بناء الجملة ، والنوافذ النشطة ، وقراءة كود المشروع والمزيد. في الواقع ، إذا غطست في توثيق هذه المكتبة ، يمكنك أن تجد لنفسك الكثير من الوظائف المفيدة. في هذا المثال ، نستخدمه تحديدًا للحصول على قائمة بالمشاريع في حل نشط.

على الرغم من قاعدة الشفرة المجانية الصغيرة ، نحن بحاجة فقط إلى بضعة أسطر من التعليمات البرمجية للحصول على قائمة بالمشاريع في الحل النشط:

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         

بهذه السهولة والطبيعية يمكننا جمع معلومات تفصيلية حول جميع المشاريع النشطة.

خذ من هذه القائمة أسماء المشاريع (خاصية الاسم) والمسار إلى ملفات csproj (فجأة ، FullName): هذا يكفي تمامًا أن نسأل المستخدم عن المشروع المطلوب من قائمة المشاريع المحتملة وتعيينه إلى الدليل للبحث عن التجميعات.

الخطوة التالية هي توصيل المكتبة ، التي تتمثل مهامها في تحليل التجميع ، وجمع الاختبارات التلقائية ونشرها على بوابة اختبار تكنولوجيا المعلومات. سنحذف تفاصيل إنشاء المكتبة ، ولكننا سنوفر فئة مثيرة للاهتمام يمكنها الحصول على قائمة الاختبارات التلقائية من التجميع المحمل:

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);
        }
    }

يمكن دائمًا عرض كود المصدر الكامل للمكتبة في مستودعنا .

لذا ، عد إلى الامتداد. لبدء منطق مكتبتنا ، تحتاج إلى إضافة أمر جديد ، في طريقة التنفيذ التي نكتب منها استدعاء المكتبة ، وتمريرها سمات فئات وطرق الاختبار ، بالإضافة إلى معلمات الامتداد المحفوظة:

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);

ملاحظة مهمة: نحن نتخطى المسجل في المكتبة حتى نتمكن من كتابة المعلومات الفنية مباشرة إلى نافذة إخراج رسالة Visual Studio. لا يجب ربط المكتبة بهذا IDE فقط ، فمن المهم بالنسبة لنا أن نترك الفرصة لاستخدامها في أي موقف.

النتائج


ونتيجة لذلك ، بعد التطوير ، حصلنا على شيء مثل هذا التمديد:



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



دعنا نفتح حل مثال يحتوي على مشروع مع اختبارات الوحدة ، ونختبر امتدادنا عليه. عند تحميل مشروع ، يمكننا على الفور ملاحظة زر جديد على اللوحة:



خذ على الفور مفتاح API السري من حسابك الشخصي وقم بإعداد مشروع جديد على منصتنا:





بعد ذلك ، دعنا نعود إلى الامتداد. دعنا نفتح نافذتنا بمعلمات الامتداد ونملأ الحقول:



لقد مررنا قائمة المشاريع الحالية إلى مصمم النوافذ ، يرجى توفيرها بواسطة مكتبة Visual Studio SDK ، وقمنا بتحميل خيارات "Project dll" بعد تحديد المشروع: بحثت الخدمة عن جميع ملفات dll في تجميع المشروع "UnitTestProject وأظهر لنا خيارات المكتبة الممكنة. نقوم بحفظ الإعدادات وتشغيل الوظائف الرئيسية لملحقنا.

في نافذة الإخراج ، بعد بضع ثوانٍ ، نرى ما يلي:



من يهتم بكيفية إخراج الرسائل - يمكن العثور على شفرة المصدر الخاصة بالمسجل هنا .

في مثالنا ، كان هناك 3 اختبارات وحدة و 3 اختبارات تكامل. تبدو الحقيقة. تحقق من وجود بوابة:



استنتاج


درسنا اليوم أساسيات إنشاء ملحقات لبرنامج Visual Studio باستخدام مثال ملحق لنشر قائمة الاختبارات التلقائية على منصة Test IT. خيارات التمديد محدودة فقط بمخيلتك: يمكنك تنفيذ محادثة مع فريق ، يمكنك إنشاء إشعارات في حالة تعطل المشروع في الفرع الخاص بك ، يمكنك حتى ، كما في خيالاتنا حول Bot Framework ، إضافة زر طلب بيتزا إلى المكتب.

احلم ، وخلق ، وتوفير الوقت ، والبقاء دائما المتخصصين المبدعين!

نبذة عن الكاتب



Mikhail Pirogovsky هو مطور .NET. تمت كتابة المادة مع فريق اختبار تكنولوجيا المعلومات. في مجموعتنا على Facebook ، نتحدث عن العمل في ضمان الجودة والاختبار والأدوات والمزيد.

All Articles