Advertisement
  1. Code
  2. Creative Coding

دليل المبتدئين لاختبار الوحدة: بناء البرنامج المساعد للتجارب 

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

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

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


منهجية اختبار الوحدة 

عندما يتعلق الأمر بالاختبار ، هناك طريقتان بوجه عام للقيام بذلك: 

  • اكتب اختباراتك ، ثم اكتب رمزًا لتجربة اختباراتك 
  • اكتب الكود ، ثم اكتب الاختبارات التي تمر 

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

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

مع أخذ ذلك في الاعتبار ، سوف نبني بهذه المنهجية البسيطة 

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

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


بناء البرنامج المساعد للتجارب 

عند هذه النقطة ، حان الوقت لبدء كتابة بعض التعليمات البرمجية ؛ ومع ذلك ، على عكس معظم المشاريع ، لن نقفز إلى الشفرة الخاصة بـ WordPress حتى الآن. بدلاً من ذلك ، سنقوم بإعارة صف اختبار الوحدة لدينا.  If you've structured your plugin's directory based on what we shared in the first post or how we've configured it on GitHub, then you should have a hello_reader_tests.php file located in your tests/wordpress-tests directory.  ليس عليك اتباع هذه المنظمة ، بالطبع ، ولكنها ستساعد في التقدم خلال المشروع. 

دعونا نمنع فئة اختبار الوحدة 

1
require_once( '../../plugin.php' );
2
3
class Hello_Reader_Tests extends WP_UnitTestCase {
4
5
} // end class

الآن ، حاول تشغيل الاختبار باستخدام المحطة باستخدام وحدة PHP.  بافتراض أنك تقوم بتشغيل وحدة PHP من تثبيت MAMP المحلي ، يجب أن تتمكن من إدخال: 

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit  ./hello_reader_tests.php 

عند هذه النقطة ، سترى فشلاً 

Failing TestsFailing TestsFailing Tests

ذلك جيد!  هذا يعني أنه تم تثبيت PHPUnit وتشغيله وأن إطار اختبار WordPress جاهز للعمل.  فشل الاختبار ببساطة لأننا لم نكتب في الواقع أي اختبارات.  دعونا نبدأ في القيام بذلك. 

اختبارنا الأول 

أولاً ، دعنا نكتب اختبارًا للتأكد من تهيئة المكون الإضافي ، وإنشاء مثيل له ، والاستعداد للاختبار.  Recall earlier in the first article that we stored a reference to the instance of Hello Reader into the PHP $GLOBALS array.  هذه هي الطريقة التي سنتمكن من الوصول إلى هذا المثال باستخدام إطار الاختبار. لذلك دعونا نقوم بتحديث اختبار الوحدة لدينا لتبدو هكذا: 

لاحظ أنه من أجل المساحة ، سأترك تعليقات الكود ، لكن المكوّن الإضافي والفحص المعلق بالكامل سيكون متاحًا على GitHub.

1
require_once( '../../plugin.php' );
2
3
class Hello_Reader_Tests extends WP_UnitTestCase {
4
5
  private $plugin;
6
7
	function setUp() {
8
		
9
		parent::setUp();
10
		$this->plugin = $GLOBALS['hello-reader'];
11
	
12
	} // end setup

13
	
14
	function testPluginInitialization() {
15
		$this->assertFalse( null == $this->plugin );
16
	} // end testPluginInitialization

17
18
} // end class

أعلاه ، قمنا بإعداد مرجع إلى مثيل المكون الإضافي حتى نتمكن من الوصول إليه خلال اختبارات الوحدة الخاصة بنا.  We're using the setUp method to grab the reference to the plugin from $GLOBALS.  Note, however, that we've introduced another function calledtestPluginInitialization.  This function verifies that the reference we've setup in thesetUp method is not null. 

إذا أعدت إجراء الاختبارات ، فيجب أن تحصل الآن على اختبار ناجح ويجب أن تبدو الوحدة الطرفية كما يلي: 

Passing TestsPassing TestsPassing Tests

There is an important takeaway here: Note that the single function we've provided above has a clear purpose: to verify that the plugin has been properly initialized.  اسم وظيفتها واضح ويحتوي على بيان تأكيد واحد. هذه طريقة رائعة لتخطيط اختباراتنا المتبقية بشكل أساسي لأنها تجعل من السهل العثور على الأخطاء عند ظهورها.  فكر في الأمر بهذه الطريقة: إذا قمت بتضمين عدد من عبارات التوكيد المختلفة في وظيفة واحدة ، فسيكون من الصعب تحديد بيان التوكيد الذي فشل.

الوظيفة الأولى 

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

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

1
function testAddWelcomeMessage() {
2
	$this->assertEquals( 'TEST CONTENT', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' );	
3
} // end testAddWelcomeMessage

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

1
class Hello_Reader {
2
	
3
	function __construct() {
4
		add_filter( 'the_content', array( &$this, 'add_welcome_message' ) );
5
	} // end constructor

6
  
7
	public function add_welcome_message( $content ) {
8
		
9
	} // end add_welcome_message

10
11
} // end class

حاول الآن لتشغيل الاختبار.  لن يفجر الاختبار ، ولكن يجب أن ترى في الواقع إخفاقًا مع رسالة واضحة عن سبب فشل الاختبار: 

1
1) Hello_Reader_Tests::testAddWelcomeMessage
2
add_welcome_message() appends welcome message to the post content.
3
Failed asserting that null matches expected 'TEST CONTENT'

لذا ، تمشيا مع منهجيتنا ، نريد أن نجعل هذا الاختبار يمر.  In order to do so, we need to make sure that the post content contains the string of text – in this case, 'TEST CONTENT', in order to make it pass.  لذلك دعونا نحاول هذا.  قم بتحديث الوظيفة المقابلة في الملحق لإلحاق السلسلة قبل المحتوى: 

1
public function add_welcome_message( $content ) {
2
	return 'TEST CONTENT' . $content;
3
} // end add_welcome_message

ومرة أخرى ، أعدنا الاختبار فقط لنرى أنه فشل.  If you notice our test, this is because it's looking to see of our content equals the 'TEST CONTENT' string.  بدلاً من ذلك ، نحتاج إلى التأكد من أن السلسلة تبدأ على المحتوى.  هذا يعني أننا بحاجة إلى تحديث الاختبار.  Luckily, PHPUnit has an assertContains function.  لذلك دعنا نقوم بتحديث الكود الخاص بنا لاستخدامه: 

1
function testAddWelcomeMessage() {
2
	$this->assertContains( 'TEST CONTENT', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' );
3
} // end testAddWelcomeMessage

مرة أخرى ، أعد تشغيل الاختبار ويجب أن ترى أن الاختبار الآن يمر.  رائع!  نحتاج الآن إلى كتابة رسائل مخصصة للأشخاص القادمين من Twitter والأشخاص القادمين من Google. 

الترحيب بزوار تويتر لدينا 

هناك عدد من الطرق المختلفة التي يمكننا التحقق منها لمعرفة كيفية وصول المستخدم إلى صفحة معينة.  في بعض الأحيان يمكننا التحقق من القيم في صفيف $ _GET ، وأحيانًا يمكننا استجواب مصفوفة _SERVER $ ، أو أحيانًا يمكننا التحقق من جلسة المستخدم.  لأغراض هذا المثال ، سنبحث عن "twitter.com"  to be found in the $_SERVER['HTTP_REQUEST'].  أقول هذا فقط لكي تتمكنوا من المتابعة مع ما نقوم به في الكود. 

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

في المكوّن الإضافي: 

1
public function is_from_twitter() {
2
	
3
} // end is_from_twitter

في الاختبار: 

1
function testIsComingFromTwitter() {
2
3
	$_SERVER['HTTP_REFERER'] = 'http://twitter.com';
4
	$this->assertTrue( $this->plugin->is_from_twitter(), 'is_from_twitter() will return true when the referring site is Twitter.' );
5
	
6
} // end testIsComingFromTwitter

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

1
public function is_from_twitter() {
2
	return strpos( $_SERVER['HTTP_REFERER'], 'twitter.com' ) > 0;
3
} // end is_from_twitter

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

1
function testIsNotComingFromTwitter() {
2
3
	// Spoofing the HTTP_REFERER for purposes of this test and the companion blog post

4
	$_SERVER['HTTP_REFERER'] = 'http://facebook.com';
5
	$this->assertFalse( $this->plugin->is_from_twitter(), 'is_from_twitter() will return true when the referring site is Twitter.' );
6
	
7
} // end testIsNotComingFromTwitter

Notice that we've updated the HTTP_REFERER and we've changed assertTrue to assertFalse.  السماح بكل شيء آخر صحيح ، قم بتشغيل الاختبارات ويجب أن تمر. 

تكرار نفسه لجوجل 

سيتطلب تقديم رسالة مخصصة لـ Google الشيء نفسه الذي فعلناه مع Twitter ، أي ،احتيال HTTP_REFERER وإرجاع true أو false لوظيفة المساعد.  لذلك ، من أجل تجنب سبر زائد ، سأبقي هذا القسم موجزا قدر الإمكان.  يجب اتباع نفس الخطوات بالنسبة لتويتر. 

أولاً ، نحن نعالج وظيفة المساعد في المكون الإضافي: 

1
public function is_from_google() {
2
	
3
} // end is_from_google

ثم نعطيه الاختبار: 

1
function testIsComingFromGoogle() {
2
3
	$_SERVER['HTTP_REFERER'] = 'http://google.com';
4
	$this->assertTrue( $this->plugin->is_from_google(), 'is_from_google() will return true when the referring site is Google.' );
5
	
6
} // end testIsComingFromGoogle

سيؤدي إجراء الاختبار كما هو الآن إلى حدوث إخفاق.  لذا ، دعنا ننفذ الدالةis_from_google () : 

1
public function is_from_google() {
2
	return strpos( $_SERVER['HTTP_REFERER'], 'google.com' ) > 0;
3
} // end is_from_twitter

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

1
function testIsNotComingFromGoogle() {
2
3
	// Spoofing the HTTP_REFERER for purposes of this test and the companion blog post

4
	$_SERVER['HTTP_REFERER'] = 'http://facebook.com';
5
	$this->assertFalse( $this->plugin->is_from_google(), 'is_from_google() will return true when the referring site is Google.' );
6
	
7
} // end testIsNotComingFromGoogle

وأخيرا ، قم بتشغيل الاختبارات الخاصة بك.  السماح بكل شيء آخر صحيح ، يجب أن يكون لديك ستة اختبارات ناجحة. 

سحب كل شيء معا 

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

  • عندما يأتي المستخدم من Twitter ، سنقول "مرحبًا من Twitter!" 
  • عندما يأتي المستخدم من Google ، سنقول "مرحبًا بك من Google!" 
  • عندما يأتي المستخدم من أي مكان آخر ، لن نقوم بإضافة أي شيء. 

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

أولاً ، سنقوم بإضافة اختبار يتحقق من رسالة ترحيب Twitter. 

في المكون الإضافي ، سنقلل add_welcome_message إلى هذا: 

1
public function add_welcome_message( $content ) {
2
	return $content;
3
} // end add_welcome_message

وسنضيف اختبار Twitter ، أولاً: 

1
function testDisplayTwitterWelcome() {
2
	
3
	// Spoof the HTTP_REFERER for Twitter

4
	$_SERVER['HTTP_REFERER'] = 'http://twitter.com';
5
	$this->assertContains( 'Welcome from Twitter!', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' );			
6
	
7
} // end testDisplayTwitterWelcome

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

1
public function add_welcome_message( $content ) {
2
3
	if( $this->is_from_twitter() ) { 
4
		$content = 'Welcome from Twitter!' . $content;
5
	} // end if

6
	
7
	return $content;
8
	
9
} // end add_welcome_message

تشغيله مرة أخرى ، وسوف تمر.  التالي هو اختبار Google: 

1
function testDisplayGoogleWelcome() {
2
	
3
	// Spoof the HTTP_REFERER for Google

4
	$_SERVER['HTTP_REFERER'] = 'http://google.com';
5
	$this->assertContains( 'Welcome from Google!', $this->plugin->add_welcome_message( 'This is example post content. This simulates that WordPress would return when viewing a blog post.' ), 'add_welcome_message() appends welcome message to the post content.' );	
6
		
7
} // end testDisplayGoogleWelcome

قم بتشغيل الاختبار ، فهل فشلت ، ثم قم بتحديث add_welcome_message في البرنامج المساعد ليحتوي على فحص باستخدام وظيفة المساعد التي كتبناها في وقت سابق: 

1
public function add_welcome_message( $content ) {
2
	
3
	if( $this->is_from_twitter() ) { 
4
		$content = 'Welcome from Twitter!' . $content;
5
	} else if( $this->is_from_google() ) {
6
		$content = 'Welcome from Google!' . $content;
7
	} // end if

8
	
9
	return $content;
10
	
11
} // end add_welcome_message

في هذه المرحلة ، يجب أن يكون لديك ملحق وظيفي بالكامل يحتوي على سبعة اختبارات وحدة ناجحة! 


الاستنتاج

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

وأخيرًا ، يمكنك العثور على هذا المكون الإضافي واختبارات WordPress واختبارات وحدة Hello Reader التي تم التعليق عليها بالكامل على GitHub . 

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.