2015-07-02 19 views
10

Django uygulamasında ortam değişkenlerini çalıştırmak için test yapabilmek için test edebilmek istiyorum. Örneğin, görüşlerim birkaç API anahtarına dayanıyor.django ortam test değişkenleri en uygun testlerde

override settings during testing için yollar vardır, ancak bunların bir güvenlik sorunu olduğu için settings.py olarak tanımlanmasını istemiyorum.

Bu ortam değişkenlerini ayarlamak için kurulum işlevimde denedim, ancak bu Django uygulamasına değerleri vermek için çalışmaz.

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

Ben Yerel olarak test

, ben sadece ben değerlerle os.environ besler

foreman start -e .env web 

ile çalışacak bir .env dosyası var. Ancak Django'nun unittest.TestCase numaralı telefonunda bunu tanımlamanın bir yolu yoktur.

Bunu nasıl aşabilirim?

+2

sen [EnvironmentVarGuard] (https://docs.python.org/2/library/test.html#test.test_support.EnvironmentVarGuard) kullanarak denediniz mi: Bunu kullanabilir? – schillingt

+0

Evet, bu doğru cevaptı! – lollercoaster

cevap

7

@schillingt'ın yorumlarda belirtildiği gibi, EnvironmentVarGuard doğru yoldu.

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 

Bu doğru bağlam nesnesi with deyimi süresince ortam değişkenlerini.

+1

Bir içe aktarma hatası atar. Ek olarak, EnvironmentVarGuard belgeleri şu şekildedir: "Uyarı Test paketi Python tarafından dahili kullanım içindir. Python'un çekirdek geliştiricilerinin yararına belgelenmiştir. Bu paketin Python'un standart kütüphanesinin dışında kullanımı kodun söz konusu olduğu gibi önerilmez. Python'un yayınları arasında haber verilmeksizin değiştirilebilir veya silinebilir. " – Nate

+3

python 3, bunu test.support EnvironmentVarGuard öğesinden içe aktardı. Ancak, yalnızca iç kullanım amaçlı kodlara bağlı olmayı tercih etmemeniz durumunda, [python 2.7 EnvironmentVarGuard uygulamasının] kopyalanabilir (https://github.com/python/cpython/blob/2.7/Lib/test/test_support .py # L957-L1001) kendi kodunuza - oldukça basittir. – medmunds

0

Test çalıştırıcım olarak py.test kullanıyorum ve testleri çalıştırırken kullanmak için belirli bir ayar dosyasını belirtebileceğiniz bir pytest.ini dosyası oluşturmanıza olanak tanır. Bu burada

bakınız belgeleri: o Test sınıfları ve hatta basit fonksiyonların farklı türde destekler ve ayarlamak oldukça kolaydır, çünkü bir test koşucu olarak genelde py.test tavsiye

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

testlerden önce ve sonra çalışan armatürler veya diğer kodlar.

+0

Bu, 'settings.py' dosyalarını, ortam değişkenlerini değil nasıl değiştirilir. API çağrılarım, örneğin AWS, vb. Django ayarları değil, çevre değişkenlerini arayan kurucularla yapılır. – lollercoaster

+0

"Test sırasında ayarları geçersiz kılmanın yolları var, ancak bunların bir settings.py dosyasında güvenlik sorusu olarak tanımlanmasını istemiyorum." Dediniz. Bir test dosyasındaki tanımlayıcı değişkenlerin, test yürütücünüz tarafından * sadece * kullanılan bir güvenlik sorunu olduğunu göremiyorum. – erewok

+0

Daha açık olmalıydım. İki konu var. 1) güvenlik, kimlik bilgileri vermeme, 2) iş akışım ile 'boto' ve diğer API'lerin kullanımı ile çevre değişkenleri kullanabilmeyi çok isterim. Ben sadece settings.py – lollercoaster

0

Eski soru, ancak bir Google aramasında ortaya çıktı ve mevcut cevapların hiçbiri uygun değil. Pytest kullanıyorsanız, env vars pytest's monkeypatching functionality kullanılarak ayarlanabilir/geri yüklenebilir.

13

test.support.EnvironmentVarGuard, sürümden sürüme geçiş (geriye dönük uyumsuz) değişiklikleriyle değiştirilebilecek dahili bir API'sidir. Aslında, tüm test paketinin yalnızca dahili kullanımı vardır. Test paketi dokümantasyon sayfasında, çekirdek kitaplıklarının dahili testi için ve bir genel API DEĞİLDİR. (aşağıdaki bağlantılara bakın)

python'un standart lib unittest.mock numaralı telefonunda patch.dict() kullanmalısınız. İçerik yöneticisi, dekoratör veya sınıf dekoratör olarak kullanılabilir. Resmi Python belgelerinden kopyalanan örnek koda bakın.

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 

Güncelleme: iyice belgeleri okumaz ve not kaçırabilecekti olanlar için,

https://docs.python.org/2/library/test.html veya

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

+2

Sağladığınız bağlantıdaki @seb, 'class test.test_support.EnvironmentVarGuard' kaynağına bağlanmıştır, diğer bir deyişle, ** Python ** için bir regresyon test paketi olan 'test' paketinin parçasıdır. Ve sonra sayfanızı kaydırın TÜMÜNÜ YÜKSELTİN, başlığın hemen ardından ikinci satırdaki notu okuyun: _Note Test paketi sadece Python tarafından dahili kullanım içindir. Python'un çekirdek geliştiricilerinin yararı için belgelenmiştir. Bu paketin Python’un standart kütüphanesinin dışında kullanılması Python’un yayınları arasında haber verilmeksizin değiştirilebilir veya kaldırılabilir. – Devy

1

Eğer varsa daha test paket notları okumak Ortam değişkenlerinizi Django'nun settings.py dosyasında şu şekilde yükleme:
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):

İlgili konular