البرنامج النصي اختبار الأنف مع وسيطات سطر الأوامر
-
11-09-2019 - |
سؤال
أرغب في أن أكون قادرا على تشغيل برنامج نصي اختبار الأنف الذي يقبل حجج سطر الأوامر. على سبيل المثال، شيء على طول الخطوط:
Test.py.
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
ومع ذلك، كلما قمت بتشغيل هذا مع وسيطة سطر الأوامر، أحصل على خطأ:
$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
module = resolve_name(addr.module)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
module = __import__('.'.join(parts_copy))
ImportError: No module named arg
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
على ما يبدو، يحاول الأنف القيام بشيء مع الحجج التي مرت في sys.argv. هل هناك طريقة لجعل الأنف تجاهل تلك الحجج؟
المحلول
حسنا، أنا أكره "لماذا تريد أن تفعل ذلك؟" الإجابات بقدر أي شخص، لكنني سأضطر إلى جعل واحدة هنا. انا آمل انك لا تمانع.
سأجادل بأن القيام بكل ما تريد القيام به ليس ضمن نطاق الأنف الإطاري. الأنف مخصص ل الآلي اختبارات. إذا كان عليك أن تمر في حجج سطر الأوامر للاختبار لتمريره، فلا تتمكن من أتمتة. الآن، ما أنت يمكن هل هو شيء مثل هذا:
import sys
class test_something(object):
def setUp(self):
sys.argv[1] = 'arg'
del sys.argv[2] # remember that -s is in sys.argv[2], see below
def test_method(self):
print sys.argv
إذا قمت بتشغيل ذلك، فستحصل على هذا الإخراج:
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(تذكر أن تمر في علم -S إذا كنت ترغب في معرفة ما يحدث على Stdout)
ومع ذلك، ربما ما زلت أوصي بذلك، حيث إنها فكرة سيئة عموما للفوضى مع الحالة العالمية في الاختبارات الآلية إذا كنت تستطيع تجنب ذلك. ما الذي أرغب في ذلك هو أن أتكيف كل الكود الذي أريد اختباره لأخذ argv
قائمة. بعد ذلك، يمكنك تمرير كل ما تريد أثناء الاختبار sys.argv
في الانتاج.
تحديث:
السبب في أنني بحاجة إلى القيام بذلك هو أنني اختبار تطبيقات متعددة من نفس المكتبة. لاختبار هذه التطبيقات صحيحة، يمكنني استخدام برنامج نصي واحد، يقبل كوسيطة سطر الأوامر أن المكتبة التي يجب أن تستوردها لاختبار.
يبدو أنك قد ترغب في تجربة يدك في كتابة مساعد الأنف. من السهل جدا القيام به. فيما يلي أحدث مستندات.
نصائح أخرى
يمكنك استخدام وسيلة أخرى للحصول على الاشياء في التعليمات البرمجية الخاصة بك:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
ثم تذكر فقط تعيين بيئتك قبل تشغيل الأنف.
أعتقد أن هذا سيناريو مقبول تماما. كنت بحاجة أيضا إلى القيام بشيء مماثل من أجل إدارة الاختبارات ضد سيناريوهات مختلفة (DEV و QA أو PROD، إلخ) وهناك أحتاج إلى عناوين URL والتكوينات الصحيحة لكل بيئة.
الحل الذي وجدته هو استخدام الأنف testconfig. توصيل في (الرابط هنا). لا يمر بالضبط وسيطات سطر الأوامر بالضبط، ولكن إنشاء ملف تكوين مع جميع المعلمات الخاصة بك، ثم تمرير ملف التكوين هذا كوسيطة عند تنفيذ اختبارات الأنف.
يحتوي ملف التكوين على التنسيق التالي:
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
ويمكنك قراءة الوسائط باستخدام:
from testconfig import config
print(config['dbConfig']['user'])
الآن أنا أستخدم الاختراق التالي:
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
التي تقرأ فقط الحجة في متغير محلي، ثم حذف جميع الوسيطات الإضافية في sys.argv
بحيث لا يحتفل به هذا الأنف.
فقط تشغيل الأنف والتمرير في المعلمات لن يعمل لأن الأنف سيحاول تفسير الوسائط مع معلمات الأنف حتى تحصل على المشاكل التي تراها.
لا أعتقد أن المعلمة دعم الأنف تمر مباشرة حتى الآن ولكن هذا المكون الإضافي الأنف الأنف testconfig. يتيح لك كتابة الاختبارات مثل أدناه:
from testconfig import config
def test_os_specific_code():
os_name = config['os']['type']
if os_name == 'nt':
pass # some nt specific tests
else:
pass # tests for any other os