Python
monkeypatch
monkeypatch ile yamalamayı öğrenirsin.
monkeypatch
monkeypatch, test sırasında değerleri geçici olarak değiştirir; test bitince otomatik geri alır. Ortam değişkeni, modül özniteliği ya da fonksiyon davranışını taklit etmek için kullanılır.
Bir fixture gibi parametre olarak enjekte edilir: def test_x(monkeypatch):. monkeypatch.setattr(obj, "name", value) özniteliği değiştirir; monkeypatch.setenv("KEY", "v") ortam değişkeni koyar.
def test_with_env(monkeypatch):
monkeypatch.setenv("MODE", "test")
assert os.environ["MODE"] == "test"
Test bittiğinde pytest eski değeri geri yükler; başka testler etkilenmez.
monkeypatch ve fonksiyon taklidi
monkeypatch ile fonksiyonları da taklit edebilirsin. monkeypatch.setattr(requests, "get", fake_get) yazarak requests.get yerine kendi fonksiyonunu koyarsın; gerçek ağ çağrısı yapmazsın.
Örnek: def fake_get(url): return {"status": 200} sabit yanıt döner. Test hızlı ve deterministik olur; ağ kesintisinde çalışmaz.
Bu yöntem, dış bağımlılıkları testten ayırır. unittest.mock'un patch decorator'üne benzer; ama monkeypatch daha sade bir API sunar.
Uygulama monkeypatch ile ortam değişkeni
import os ile başla. get_mode() fonksiyonu os.environ.get("MODE", "prod") döndürsün. test_mode(monkeypatch) fonksiyonu monkeypatch.setenv("MODE", "test") yapsın ve assert get_mode() == "test" denetimi ekle. Dosya sonunda test_mode'u type('', (), {"setenv": staticmethod(lambda k, v: os.environ.__setitem__(k, v))})() benzeri basit bir nesneyle çağır; bunun yerine test_mode(monkeypatch_stub) şeklinde çalışacak küçük bir saplama nesnesi oluştur ve print("ok") yaz.
Örnek çözümü göster
import os
def get_mode():
return os.environ.get("MODE", "prod")
def test_mode(monkeypatch):
monkeypatch.setenv("MODE", "test")
assert get_mode() == "test"
class Stub:
def setenv(self, key, value):
os.environ[key] = value
test_mode(Stub())
print("ok")
Kendini test et
-
monkeypatch hangi amaçla kullanılır?
- Test sırasında değerleri geçici değiştirip geri almak
- Test sayısını artırmak
- Kalıcı kod değişikliği yapmak
- Test adlarını yeniden adlandırmak
Cevabı göster
Test sırasında değerleri geçici değiştirip geri almak — monkeypatch değerleri test süresince değiştirir; test bitince eski hâline döndürür.
-
setattr çağrısını tamamla
def test_with_attr(monkeypatch):
monkeypatch.____(math, "pi", 3)
Cevabı göster
def test_with_attr(monkeypatch):
monkeypatch.setattr(math, "pi", 3)
-
monkeypatch metotlarını eşleştir
- setattr
- Özniteliği değiştirir
- setenv
- Ortam değişkeni koyar
- delattr
- Özniteliği siler
- monkeypatch (parametre)
- Teste enjekte edilir
Sıradaki ders: Özet - Pytest