اختبار تحميل Visual Studio لمحاكاة العديد من المستخدمين بطريقة تعتمد على البيانات؟

StackOverflow https://stackoverflow.com//questions/12710732

سؤال

أحاول تحميل اختبار خدمة ويب.

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

لأنني يريد يحتاج لاختبار العديد من المدخلات المختلفة لاختبار الخدمة بشكل فعال، قمت بإعداد ملف CSV يحتوي على 1000 صف تقريبًا كمصدر بيانات لاختبار الوحدة.

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

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

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

...

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

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

المحلول

انتهى بي الأمر باستخدام هذه الإجابة كدليل: https://stackoverflow.com/a/7813465/237723

بدلاً من إنشاء اختبار الوحدة من طريقة تطبيق وحدة التحكم واختبار التحميل الذي - التي اختبار الوحدة، قمت بإنشاء نموذج ويب ASP.NET بسيط يأخذ المدخلات ويسمى خدمة الويب.

لقد قمت بتسجيل اختبار أداء الويب باستخدام هذا النموذج الجديد، وقمت بإنشاء اختبار تحميل لتشغيل اختبار WPT.


  1. بعد تسجيل الاختبار، أضفت ملف CSV كمصدر بيانات إلى هذا الاختبار.

  2. تم تسجيل "طلبين":الحصول الأولي والنشر اللاحق. تأكد من تركهما معًا!لقد قمت بإزالة طلب favicon.ico لأنه لم يكن موجودًا.(قد يكون من الممكن تجنب هذه الاحتياطات)

  3. من خلال توسيع طلب POST، قمت بتعديل خصائص معلمات TextBox التي تتوافق مع مدخلات خدمة الويب الخاصة بي للحصول على قيمها من العمود المناسب في ملف CSV.

  4. لقد قمت بتغيير طريقة الوصول إلى مصدر البيانات إلى "عدم تحريك المؤشر تلقائيًا" (يجب عليك توسيع مصدر البيانات إلى الجدول وتحرير خصائصه عبر النقر بزر الماوس الأيمن/F4.)

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


public class webtestplugin : WebTestPlugin
{
    public override void PreWebTest(object sender, PreWebTestEventArgs e)
    {
        base.PreWebTest(sender, e);
        e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
    }
}

نصائح أخرى

فقط للإجابة على سؤالك، أنا متأكد تمامًا من أنه لا يمكن القيام بذلك خارج نطاق MSTest وNUnit (هذا النهج لن تلتزم في هذا السيناريو).


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

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

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

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

تظهر الصورة مكان إجراء التعديل.

enter image description here

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