سؤال

أبحث عن اقتراحات لتحسين عملية أتمتة الاختبار الوظيفي لموقع الويب. إليك ما جربته في الماضي.

اعتدت أن يكون لديك مشروع اختبار باستخدام واتين. وبعد يمكنك كتابة ما يبدو وكأنه "اختبارات الوحدة" واستخدم Watin لأتمتة متصفح للنقر فوق موقعك وما إلى ذلك.

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

بهذه الطريقة، يمكن لشخص جديد أن يحقق الأحدث من التحكم في المصدر الخاص بنا وتشغيل البرنامج النصي للبناء، وشاهد جميع الاختبارات تشغيل. يمكنهم أيضا تشغيل جميع الاختبارات من IDE.

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

كنت فضوليا على ما قمت به لأتمتة الاختبارات الوظيفية لحل بعض هذه المشكلات وما زالت تبقيها بسيطة.

المزيد من التفاصيلمنذ أن طلب الناس المزيد من التفاصيل، ها هو. أنا أقوم بتشغيل ASP.NET باستخدام Visual Studio و Cassini (خادم الويب المدمج). اختبارات وحدتي تعمل في mbunit (ولكن هذا ليس مهما جدا. يمكن أن يكون nunit أو xunit.net). عادة، لدي إطار عمل وحدة منفصلة تشغيل كل اختبارات واتين. في مرحلة التحميل التجميع، أبدأ تشغيل WebServer ونسخ كل رمز تطبيق الويب الخاص بي محليا.

أنا مهتم بالحلول لأي منصة، لكنني قد أحتاج إلى المزيد من الأوصاف على ما يعنيه كل شيء. :)

هل كانت مفيدة؟

المحلول

فيل،

يمكن أن يكون الأتمتة من الصعب فقط الحفاظ عليها، ولكن كلما استخدمت أتمتةك لنشرها، كلما استطعت الاستفادة منها عن إعداد اختبار (والعكس بالعكس).

بصراحة، من الأسهل تطوير رمز التشغيل الآلي، مما يؤدي إلى إعادة تشغيله وإعادة صياغةه في وحدات عمل صغيرة محددة من الوظائف عند استخدام أداة الإنشاء التي ليست كذلك
مجرد القيادة على وحدات الوظائف المترجمة بشكل ثابت، كما هو الحال مع Nant و Msbuild. هذا أحد أسباب أن العديد من الأشخاص الذين كانوا مستخدمين مبكرين نسبيا من Toole مثل Nant قد انتقلوا إلى أشعل النار. حرية التعامل مع رمز الإنشاء كأي كود آخر - إلى تطور محتواها وتشكيلها بشكل معقول - أكبر مع أشعل النار. أنت لا ينتهي بك الأمر إلى نفس الركود في القطع الأثرية الأتمتة بسهولة وبسرعة مع أشعل النار، وهو أمر أسهل كثيرا في أشعل النار من Nant أو MSBUILD.

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

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

اختبار بيانات الاختبار هو ببساطة مجرد ألم في المؤخرة في بعض الأحيان. لا بد من القيام به.

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

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

أحتفظ بهذه المراقبون في منطقة عادة ما أسميها "Test_Support".

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

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

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

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

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

دعونا اللحاق بالركب في وقت ما والتحدث أكثر عن آخر 90٪ من هذه الأشياء :)

نصائح أخرى

كنا بلازما في مشروع واحد. يقوم بمحاكاة خادم الويب قيد التشغيل - توجيه الأمر فقط في جذر مشروع تطبيق الويب الخاص بك.

كان مستقرا بشكل مدهش - لا يقوم بنسخ الملفات أو بدء تشغيل خادم العملية.

هنا كيف اختبار باستخدام البلازما يبحث عنا ...

    [Test]
    public void Can_log_in() {
        AspNetResponse response = WebApp.ProcessRequest("/Login.aspx");
        AspNetForm form = response.GetForm();

        form["UserName"] = User.UserName;

        form["Password"] = User.Password;

        AspNetResponse loggedIn = WebApp.ProcessRequest(Button.Click(form, "LoginUser"));


        Assert.IsTrue(loggedIn.IsRedirect());

        AspNetResponse homePage = WebApp.ProcessRequest(loggedIn.GetRedirectUrl());

        Assert.AreEqual(homePage.Status, 200);
    }

يتم تضمين جميع فئات "Aspnetresponse" و "Aspnetform" مع البلازما.

نحن نستخدم حاليا عملية بناء تلقائية لتطبيق ASP.NET MVC.

نستخدم الأدوات التالية:

  • teamcity.
  • svn.
  • nunit
  • السيلينيوم

نحن نستخدم برنامج نصي MSBUILD يعمل على عامل الإنشاء الذي يمكن أن يكون أي كمية من الآلات. يحصل البرنامج النصي MSBUILD على أحدث إصدار من التعليمات البرمجية من SVN ويقوم بإنشاءه.

عند النجاح، ثم ينشر القطع الأثرية إلى جهاز / مجلد معين وإنشاء الموقع الافتراضي في IIS.

ثم نستخدم مهام Msbuild Contrib لتشغيل البرامج النصية SQL لتثبيت قاعدة البيانات وتحميل البيانات، يمكنك أيضا إجراء استعادة.

في النجاح، نبدأ الاختبارات الكلية. يضمن إعداد الاختبار أن السيلينيوم قيد التشغيل وتشغيله ثم يدفع اختبارات السيلينيوم كثيرا بنفس الطريقة التي تقوم بها الوطن. السيلينيوم لديه مسجل جيد للاختبارات التي يمكن تصديرها إلى C #.

الشيء الجيد حول السيلينيوم هو أنه يمكنك قيادة FF و Chorme و IE بدلا من أن يقتصر على IE الذي كان هو الحال مع الوطن في المرة الأخيرة التي نظرت إليها. يمكنك أيضا استخدام السيلينيوم للقيام باختبار تحميل مع شبكة السيلينيوم وبالتالي يمكنك إعادة استخدام نفس الاختبارات.

على النجاح msbuild ثم علامات البناء في SVN. لدى TeamCity وظيفة تعمل بين عشية وضحاها والتي ستنشر أحدث علامة على بيئة التدريج جاهزة لمستخدمي الأعمال للتحقق من حالة المشروع في صباح اليوم التالي.

في حياة سابقة، كان لدينا نصوص Nant & Msbuild لإدارة البيئة بالكامل (تثبيت Java، Selenium، إلخ) ولكن هذا يتطلب الكثير من الوقت حتى يتم تثبيت كل وكيل بناء على ذلك مثبتة. في الوقت المناسب، سنقوم بتضمين هذه المهام.

لماذا تحتاج إلى نسخ التعليمات البرمجية؟ Ditch Cassini والسماح Visual Studio بإنشاء دليل الظاهري لك. تأكد من أن Devs يجب أن نتذكر البناء قبل تشغيل اختبارات الويب إذا تم تغيير تطبيق الويب. لقد وجدنا أن هذه ليست مشكلة كبيرة، خاصة إذا قمت بتشغيل اختبارات الويب في CI.

البيانات تحدي كبير. بقدر ما أستطيع أن أرى، يجب أن تختار بين بدائل غير كاملة. إليك كيفية التعامل معها. أولا، يجب أن أشرح أننا نعمل مع تطبيق Legacy Lemory Webforms كبير. يجب أن أذكر أيضا أن رمز المجال غير مناسب تماما لإنشاء بيانات الاختبار من داخل مشروع الاختبار.

هذا ترك لنا بضع خيارات. يمكننا: (أ) تشغيل البرامج النصية إعداد البيانات تحت الإنشاء، أو (B) إنشاء جميع البيانات عبر اختبارات الويب باستخدام موقع الويب الفعلي. المشكلة مع الخيار (أ) هي أن الاختبارات تنقل إلى جانب البرامج النصية على مستوى دقيقة. يجعل رأسي يقوم بالتفكير في مزامنة رمز اختبار الويب باستخدام T-SQL. لذلك ذهبنا مع (ب).

فائدة واحدة من (B) هي أن إعدادك يتحقق أيضا سلوك التطبيق أيضا. المشكلة هي...زمن.

يجب أن تكون الاختبارات المثالية مستقلة، دون اقتران مؤقت (يمكن تشغيله بأي ترتيب) وعدم مشاركة أي سياق (مثل بيانات الاختبار المشتركة). الطريقة الشائعة للتعامل مع هذا هي إعداد البيانات وتدميرها مع كل اختبار. بعد بعض الفكر الدقيق، قررنا كسر هذه القاعدة.

نستخدم Gallio (mbunit 3)، والتي توفر بعض الميزات الجميلة التي تدعم استراتيجيتنا. أولا، يتيح لك تحديد أمر التنفيذ على مستوى المباراة والاختبار. لدينا أربعة "إعداد" المباريات التي يتم ترتيبها -4، -3، -2، -1. تعمل هذه في الترتيب المحدد وقبل كل "تركيبات" عدم الإعداد "، والتي افتراضيا لها طلب 0.

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

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

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

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

نحن نستخدم واتين. أنا تماما مثل ذلك. مفتاح آخر للنجاح هو شيء ذلل Scott Bellware ل. ونحن نخلق الاختبارات، فإننا نبني نموذج مجردة من UI. لذلك بدلا من هذا:

browser.TextField("ctl0_tab2_newNote").TypeText("foo");

سترى هذا في اختباراتنا:

User.NotesTab.NewNote.TypeText("foo");

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

أتمنى أن يساعدك هذا.

كان من الصعب، ولكن ليس من المستحيل، بناء مرحلة اختبار التكامل في عملية البناء باستخدام Maven. ما حدث كان أساسا هذا:

  • تجاهل جميع الاختبارات Junit في دليل معين ما لم تنطلق مرحلة اختبار التكامل.
  • أضف ملف تعريف Maven لتنفيذ اختبارات التكامل.
  • لمرحلة اختبار ما قبل التكامل -

  • بدء تشغيل Jetty تشغيل التطبيق ضرب قاعدة بيانات الاختبار.

  • بدء خادم السيلينيوم
  • تشغيل اختبارات تكامل السيلينيوم في مرحلة اختبار التكامل
  • وقف Selenium Server.
  • وقف السيلينيوم

كانت الصعوبة في هذه الخطوة تقوم حقا بإنشاء رصيف - لم نتمكن من الحصول عليها فقط لإطلاق الحرب، لذلك يجب علينا فعليا أن يكون لدينا Jetty unpack الحرب، ثم قم بتشغيل الخادم - لكنه يعمل، حسنا، وهو مؤلف - كل ما عليك فعله هو نوع MVN -PintegrationTest (كان ذلك كان اسم ملف تعريف التكامل لدينا) وإيقاف تشغيله.

هل تقصد بدء التشغيل تلقائيا بعد الانتهاء من الانتهاء؟ يمكنك كتابة البرامج النصية الآلية لنسخ ملفات الإنشاء إلى IIS تعمل أثناء امتثال البناء بنجاح. ثم قم ببدء تشغيل BVT الآلي عن طريق الاتصال Mstest.exe أو طرق أخرى.

يمكنك الحصول على محاولة مع AutoitX أو لغة الوظيفة، مثل Python، Ruby.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top