سؤال

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

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

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

المحلول

انت تكتب؛

"الكثير من التعليمات البرمجية المكتوبة لوحدات التحكم الصغيرة تدور حول كتابة تكوين وقيم البيانات للتسجيل، وقراءة البيانات الواردة من السجلات والاستجابة لمقاطعة الأحداث".

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

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

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

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

[http://discuss.joelonsoftware.com/default.asp؟joel.5.530964.12 الطبل

نصائح أخرى

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

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

اكتب إصدارات MOCK من وظائف الوصول إلى المسجل / وحدات الماكرو. لاحظ أن هذا يفترض أن رمزك يستخدم مجموعة مشتركة من وظائف الوصول إلى التسجيل، وليس أشياء مخصصة مثل *(volatile int*)0xDEADBEEF = 0xBADF00D في كل مكان.

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

يتبادر إلى الذهن 8051: على الأقل في مترجم Keil 8051، لا يمكنك الاتصال بوظائف المقاطعة مباشرة. يمكن تشغيل هذا مع Preprocessor C رغم ذلك.

هل هناك أي نوع من وضع الاسترجاع حتى تتمكن من استخدام وحدة التحكم نفسها لتوليد الأحداث التي يمكنك اختبارها ضدها؟

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