سؤال

طلبي

لدي تصميم تطبيق يشبه هذا:

  • طبقة تطبيق الويب - تطبيق ASP.NET MVC مع وحدات تحكم ومسافات طرق تستخدم POCOS وخدمات الاتصال
  • طبقة الخدمة - العمليات التجارية التي تستخدم pocos ومستودعات المكالمات
  • طبقة البيانات - المستودعات التي تستخدم pocos والتواصل مع النموذج في شكل نموذج EF الذي يعد جزءًا من هذه الطبقة نفسها
  • طبقة Poco - تحدد جميع الفئات المستخدمة في التواصل بين هذه الطبقات

لذا فإن طبقة البيانات الخاصة بي شفافة تمامًا لتنفيذ نموذج البيانات لأن الطبقة العليا لا تستخدم كيانات البيانات على الإطلاق.

اختبارات

بقدر ما أفهم الوحدة ، فإن التكامل واختبار النظام (فيما يتعلق بـ ASP.NET MVC) هو:

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

مشكلة

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

كيف ينبغي للمرء أن يكتب تكامل واختبارات النظام لتطبيق ASP.NET MVC؟
أو أي تطبيق .NET لهذه المسألة؟

بعض التعليمات البرمجية التي تساعد على شرح المشكلة

لنفترض أن لدي دروسًا مثل:

  • TaskController يدعو إلى TaskService
  • TaskService يدعو إلى TaskRepository
  • TaskRepository معالجة بيانات EF داخليًا

إذن ها هي فصولي (المختصرة):

public class TaskController
{
    private ITaskService service;

    // injection constructor
    public TaskController(ITaskService service)
    {
        this.service = service;
    }

    // default constructor
    public TaskController() : this(new TaskService()) {}

    public ActionResult GetTasks()
    {
        return View(this.service.GetTasks());
    }
    ...
}

public class TaskService : ITaskService
{
    private ITaskRepository repository;

    // injection constructor
    public TaskService(ITaskRepository repository)
    {
        this.repository = repository;
    }

    // default constructor
    public TaskService() : this(new TaskRepository()) {}

    public IList<Task> GetTasks()
    {
        return this.repository.GetTasks();
    }
    ...
}

public class TaskRepository : ITaskRepository
{
    public IList<Task> GetTasks()
    {
        // code that gets tasks from EF and converts to Task POCOs
    }
    ...
}

اختبار الوحدة بسيط وسيبدو هكذا:

public void UnitTest()
{
    var mock = new Mock<ITaskService>();
    // other code that mocks the service

    TaskController controller = new TaskController(mock.Object);

    // do the test
}

ولكن عندما يتعلق الأمر باختبار التكامل ، كيف أسخر فقط من أجزاء معينة من التكامل.

public void IntegrationTest()
{
    // no mocking at all
    TaskController = new TaskController();
    // do some testing
}

بادئ ذي بدء ، لا يمكنني مجرد تسريفة قاعدة البيانات هنا؟ يمكن أن يسخر من المستودع ولدي خدمة حقيقية ووحدة تحكم ...

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

المحلول

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

سيكون اختبار النظام بالنسبة لي اختبارًا وظيفيًا (مستوى آخر من الاختبار باستخدام شيء مثل الملاءمة) ، أو اختبار واجهة المستخدم من خلال أداة مثل TestComplete أو Telerik's QA Tool.

HTH.

نصائح أخرى

لا يزال من الممكن كتابة اختبارات التكامل التي لا تتضمن واجهة المستخدم في Nunit ، Xunit ، إلخ.

لـ ASP.NET MVC على وجه الخصوص (أو أي تطبيق ويب) ، يمكنك استخدام واتين أو السيلينيوم لكتابة اختبارات النظام/التكامل باستخدام واجهة المستخدم.

قد ترغب أيضًا في النظر إلى tst لاختبار وحدة T-SQL ، و Specflow إذا كنت فضوليًا بشأن BDD في .NET.

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

لقد أجبت للتو على سؤال ذي صلة: اختبار التكامل تنفيذ. أعتقد أنها تناولت القضية هنا ، من خلال تقديم نهج واضح لاتخاذها.

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

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

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