البرنامج النصي اختبار الأنف مع وسيطات سطر الأوامر

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

سؤال

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

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top