2015-07-02 8 views
10

मैं अपने Django ऐप में पर्यावरण चर सेट करने में सक्षम होने के लिए परीक्षण चर सक्षम करने में सक्षम होना चाहता हूं। उदाहरण के लिए, मेरे विचार कई एपीआई कुंजी पर भरोसा करते हैं।django unittest परीक्षणों में पर्यावरण चर सेटिंग

override settings during testing के तरीके हैं, लेकिन मैं नहीं चाहता कि उन्हें settings.py में परिभाषित किया जाए क्योंकि यह एक सुरक्षा समस्या है।

मैंने इन पर्यावरण चर सेट करने के लिए अपने सेटअप फ़ंक्शन में कोशिश की है, लेकिन यह Django एप्लिकेशन को मान देने के लिए काम नहीं करता है।

class MyTests(TestCase): 
    def setUp(self): 
     os.environ['TEST'] = '123' # doesn't propogate to app 

जब मैं स्थानीय रूप से परीक्षण, मैं बस एक .env फ़ाइल मैं

foreman start -e .env web 

जो मूल्यों के साथ os.environ की आपूर्ति के साथ चलाने के लिए है। लेकिन Django के unittest.TestCase में इसे सेट करने के लिए कोई रास्ता नहीं है (जिसे मैं जानता हूं)।

मैं इसके आसपास कैसे हो सकता हूं?

+2

आप उपयोग करने की कोशिश [EnvironmentVarGuard] (https://docs.python.org/2/library/test.html#test.test_support.EnvironmentVarGuard) है? – schillingt

+0

हां, यह सही जवाब था! – lollercoaster

उत्तर

7

जैसा कि @schillingt टिप्पणियों में उल्लेख किया गया है, EnvironmentVarGuard सही तरीका था।

from test.test_support import EnvironmentVarGuard 
from django.test import TestCase 

class MyTestCase(TestCase): 
    def setUp(self): 
     self.env = EnvironmentVarGuard() 
     self.env.set('VAR', 'value') 

    def test_something(self): 
     with self.env: 
      # ... perform tests here ... # 
      pass 

यह सही ढंग से संदर्भ वस्तु with बयान की अवधि के लिए वातावरण चर सेट।

+1

आयात त्रुटि फेंकता है। इसके अतिरिक्त, पर्यावरणवार्गगार्ड के लिए प्रलेखन में कहा गया है: "चेतावनी परीक्षण पैकेज केवल पायथन द्वारा आंतरिक उपयोग के लिए है। इसे पायथन के मूल डेवलपर्स के लाभ के लिए दस्तावेज किया गया है। पाइथन की मानक लाइब्रेरी के बाहर इस पैकेज का कोई भी उपयोग कोड के रूप में निराश है यहां पाइथन की रिलीज के बीच नोटिस के बिना बदल या हटाया जा सकता है। " – Nate

+3

पायथन 3 ने इसे test.support आयात पर्यावरण VarGuard से 'ले जाया। हालांकि, यदि आप आंतरिक उपयोग-केवल कोड पर निर्भर नहीं हैं, तो आप [Python 2.7 पर्यावरण वर्गार्ड के कार्यान्वयन] की प्रतिलिपि बना सकते हैं (https://github.com/python/cpython/blob/2.7/Lib/test/test_support .py # L957-L1001) अपने कोड में - यह बहुत सरल है। आपके द्वारा प्रदान किए गए लिंक में – medmunds

0

मैं अपने परीक्षण धावक के रूप में py.test का उपयोग करता हूं, और यह आपको pytest.ini फ़ाइल बनाने की अनुमति देता है जिसमें आप परीक्षण चलाने के दौरान उपयोग करने के लिए एक विशेष सेटिंग्स फ़ाइल निर्दिष्ट कर सकते हैं। यह यहाँ पर

दस्तावेज़ देखें:

http://pytest-django.readthedocs.org/en/latest/configuring_django.html#pytest-ini-settings

मैं सामान्य रूप में py.test की सलाह देते हैं एक परीक्षण धावक के रूप में है, क्योंकि यह परीक्षण वर्गों और यहां तक ​​कि साधारण कार्यों के विभिन्न प्रकार का समर्थन करता है, और यह निर्धारित करने के लिए बहुत आसान है ऊपर फिक्स्चर या अन्य कोड जो परीक्षण से पहले और बाद में चलता है।

+0

यह 'settings.py' फ़ाइलों को बदलने का तरीका है, न कि पर्यावरण चर। मेरी एपीआई कॉल, उदाहरण के लिए एडब्लूएस आदि, कन्स्ट्रक्टर के साथ बनाई जाती हैं जो पर्यावरण चर के लिए देखती हैं, न कि django सेटिंग्स। – lollercoaster

+0

आपने कहा, "परीक्षण के दौरान सेटिंग्स को ओवरराइड करने के तरीके हैं, लेकिन मैं नहीं चाहता कि वे सेटिंग.py में परिभाषित हों क्योंकि यह एक सुरक्षा समस्या है।" मैं यह देखने में विफल रहता हूं कि आपके परीक्षण धावक द्वारा उपयोग की जाने वाली सेटिंग्स फ़ाइल में परिभाषित चर कैसे एक सुरक्षा समस्या है। – erewok

+0

मुझे स्पष्ट होना चाहिए था। दो मुद्दे हैं। 1) सुरक्षा, क्रेडेंशियल्स नहीं कर रहा है, 2) 'boto' और अन्य एपीआई उपयोग पर्यावरण चर के साथ मेरा वर्कफ़्लो इसलिए मैं उन लोगों का उपयोग करने में सक्षम होना चाहता हूं। मैं सिर्फ सेटिंग्स.py – lollercoaster

0

पुराना सवाल, लेकिन यह Google खोज में बदल गया और मौजूदा उत्तरों में से कोई भी उपयुक्त नहीं है। यदि आप pytest का उपयोग कर रहे हैं, तो env vars को pytest's monkeypatching functionality का उपयोग करके सेट/पुनर्स्थापित किया जा सकता है।

13

test.support.EnvironmentVarGuard एक आंतरिक एपीआई है जिसे संस्करण से संस्करण में तोड़ने (पिछड़े असंगत) परिवर्तनों के साथ बदला जा सकता है। वास्तव में, संपूर्ण test पैकेज केवल आंतरिक उपयोग है। यह परीक्षण पैकेज दस्तावेज पृष्ठ पर स्पष्ट रूप से कहा गया था कि यह कोर पुस्तकालयों के आंतरिक परीक्षण के लिए है और सार्वजनिक एपीआई नहीं है। (नीचे दिए गए लिंक देखें)

आपको पाइथन के मानक lib unittest.mock में patch.dict() का उपयोग करना चाहिए। इसका उपयोग एक संदर्भ प्रबंधक, सजावटी या कक्षा सजावट के रूप में किया जा सकता है। आधिकारिक पायथन दस्तावेज़ से कॉपी किए गए उदाहरण कोड देखें।

import os 
from unittest.mock import patch 
with patch.dict('os.environ', {'newkey': 'newvalue'}): 
    print(os.environ['newkey']) # should print out 'newvalue' 
    assert 'newkey' in os.environ # should be True 
assert 'newkey' not in os.environ # should be True 

अद्यतन: जो लोग प्रलेखन अच्छी तरह से पढ़ें नहीं करता है और टिप्पणी याद किया हो सकता है के लिए,

https://docs.python.org/2/library/test.html या

https://docs.python.org/3/library/test.html

+2

@seb, यह 'class test.test_support.EnvironmentVarGuard' के लिए अंकित है, दूसरे शब्दों में, यह' test' पैकेज का हिस्सा है, जो ** पायथन ** के लिए एक रिग्रेशन टेस्ट पैकेज है। और फिर अपने पृष्ठ को सभी तरह से स्क्रॉल करें, शीर्षक के ठीक बाद दूसरी पंक्ति में नोट पढ़ें: _ नोट परीक्षण पैकेज केवल पाइथन द्वारा आंतरिक उपयोग के लिए है। यह पायथन के मूल डेवलपर्स के लाभ के लिए दस्तावेज है। पाइथन की मानक लाइब्रेरी के बाहर इस पैकेज का कोई भी उपयोग निराश हो गया है क्योंकि यहां वर्णित कोड को Python._ के रिलीज़ के बीच नोटिस के बिना बदल या हटाया जा सकता है। – Devy

1

आप कर रहे हैं पर अधिक test पैकेज नोट्स पढ़ Django की settings.py फ़ाइल में अपने पर्यावरण चर को लोड करना:
import os ENV_NAME = os.environ.get('ENV_NAME', 'default')
आप इस का उपयोग कर सकते हैं:
from django.test import TestCase, override_settings @override_settings(ENV_NAME="super_setting") def test_...(self):

संबंधित मुद्दे