{ اختبار البرمجيات - Software Testing }

أتمتة CLI التفاعلية باستخدام Python

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


فهم المشكلة

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

مثال على أداة CLI

لتوضيح ذلك، أنشأنا أداة CLI تجريبية تسمى tgr-cli.js. تتضمن هذه الأداة عملية تثبيت شائعة تتطلب ثلاثة تفاعلات رئيسية:

  • مطالبة المستخدم بتثبيت تبعيات إضافية: سؤال بسيط بنعم/لا.
  • السماح للمستخدم باختيار لغة برمجة: قائمة يتم التنقل فيها باستخدام مفاتيح الأسهم.
  • طلب إدخال اسم مستخدم: إدخال نص متبوع بتأكيد.

عند تنفيذ الأمر tgr-cli.js install، تحدث الخطوات التالية:

  1. تسأل الأداة عما إذا كنت ترغب في تثبيت تبعيات إضافية (اضغط y للموافقة أو n للرفض).
  2. إذا اخترت نعم، تظهر قائمة لاختيار JavaScript أو TypeScript، ويتم التنقل باستخدام مفاتيح الأسهم.
  3. أخيرًا، تطالبك الأداة بإدخال اسم مستخدم، وتكمل التثبيت برسالة نجاح.

هذا النوع من التفاعلات شائع في العديد من أدوات CLI. تتطلب أتمتة هذه الأدوات معالجة أنماط إدخال متنوعة مع ضمان توقيت وترتيب دقيقين.

Interactive CLI in Action


النهج المستند إلى Unix

استخدام مكتبة pexpect

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

خطوات التنفيذ

  • تشغيل عملية tgr-cli.js install.
  • معالجة المطالبات الخاصة بالتبعيات، اختيار اللغة، وإدخال اسم المستخدم.
  • التحقق من رسالة إتمام العملية.

كود Python

import pexpect
import sys
import time

# تشغيل عملية CLI
child = pexpect.spawn('node tgr-cli.js install', timeout=30, encoding='utf-8')

# تمكين تسجيل التفاعل
child.logfile = sys.stdout

# الخطوة الأولى: معالجة التبعيات
child.expect('Do you want to install other dependencies.*\(y/N\)')
child.sendline('y')
time.sleep(1)

# الخطوة الثانية: اختيار اللغة
child.expect('Which language do you want to use.*')
child.send('\033[B')  # السهم لأسفل
time.sleep(0.5)
child.sendline('')  # Enter

# الخطوة الثالثة: إدخال اسم المستخدم
child.expect('Enter your username:.*')
child.sendline('test_name')

# التحقق من الإتمام
child.expect('Installation completed successfully!')
print("\nتمت الأتمتة بنجاح!")


النهج المستند إلى Windows

استخدام مكتبة pywinauto

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

خطوات التنفيذ

  • تشغيل عملية tgr-cli.js install.
  • استخدام pywinauto.keyboard.send_keys للرد على المطالبات.
  • انتظار إتمام العملية والتحقق من النجاح.

كود Python

import subprocess
import time
from pywinauto.keyboard import send_keys

# تشغيل العملية
process = subprocess.Popen('node tgr-cli.js install', shell=True)
time.sleep(2)

# الإجابة على المطالبة الأولى
send_keys('y{ENTER}')
time.sleep(1)

# اختيار اللغة
send_keys('{DOWN}{ENTER}')
time.sleep(1)

# إدخال اسم المستخدم
send_keys('test_name{ENTER}')

# انتظار إتمام العملية
process.wait()
print("\nتمت الأتمتة بنجاح!")


التحديات وكيفية التغلب عليها

  1. مشكلات التوقيت وتأخيرات المطالبات:
    أحيانًا تستغرق الأدوات التفاعلية وقتًا متغيرًا بين المطالبات. الحل هو إدخال تأخيرات باستخدام time.sleep() أو الانتظار الديناميكي عبر pexpect.expect().
  2. الاختلافات بين الأنظمة الأساسية:
    تختلف الأنظمة المستندة إلى Unix وWindows في طريقة التعامل مع المدخلات والمخرجات. الحل هو استخدام مكتبات تناسب النظام المستهدف مثل pexpect لأنظمة Unix وpywinauto لأنظمة Windows.
  3. تجنب التداخل مع إدخال المستخدم:
    لتجنب تداخل الإدخال، يمكن عزل البيئة باستخدام نوافذ طرفية مخصصة أو آلات افتراضية.


أفضل الممارسات

  1. استخدام السجلات:
    توثيق كل خطوة في عملية الأتمتة يسهل اكتشاف الأخطاء. يمكن استخدام sys.stdout أو وحدة logging المدمجة.
  2. إعادة المحاولة للتفاعلات غير المستقرة:
    استخدام آليات لإعادة المحاولة مع التحكم في عدد المحاولات لتجنب الحلقات اللانهائية.
  3. تنظيم السكربت:
    كتابة الكود بطريقة منظمة وقابلة لإعادة الاستخدام عن طريق تقسيمه إلى وظائف مخصصة لكل مهمة.


الخلاصة

أتمتة أدوات CLI التفاعلية قد تبدو تحديًا، لكنها تصبح ممكنة ومجزية باستخدام الاستراتيجيات والأدوات الصحيحة. باستخدام مكتبات مثل pexpect لأنظمة Unix وpywinauto لأنظمة Windows، يمكننا التعامل مع المطالبات والاختيارات والإدخالات بكفاءة. مع فهم الفروق بين الأنظمة الأساسية، واتباع أفضل الممارسات مثل السجلات وإعادة المحاولة، وكتابة كود منظم، تصبح الأتمتة أكثر موثوقية وقابلية للصيانة.

ابدأ الآن بتجربة أدوات CLI الخاصة بك واستكشاف إمكانيات جديدة للأتمتة! تتوفر أمثلة الكود الكاملة وأداة CLI المستخدمة في الشرح على صفحتنا على GitHub. جرّبها بنفسك!


المصدر: thegreenreport

مقالات ذات صلة

زر الذهاب إلى الأعلى