CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.py
# os modülünü içe aktar
# get_mode(): MODE ortam değişkenini getir, yoksa "prod"
# test_mode(monkeypatch): MODE ayarla ve denetle
# test_mode'ı çağırmak için setenv metodu olan bir saplama nesnesi oluştur
# sonra print("ok") yaz

Örnek çözüm

main.py
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")

Beklenen çıktı

ok

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 monkeypatch hangi amaçla kullanılır?

  • Test sırasında değerleri geçici değiştirip geri almak Doğru cevap
  • Test sayısını artırmak
  • Kalıcı kod değişikliği yapmak
  • Test adlarını yeniden adlandırmak

Açıklama: monkeypatch değerleri test süresince değiştirir; test bitince eski hâline döndürür.

2 setattr çağrısını tamamla

Soru
def test_with_attr(monkeypatch):
    monkeypatch.____(math, "pi", 3)
Cevap
def test_with_attr(monkeypatch):
    monkeypatch.setattr(math, "pi", 3)

Açıklama: monkeypatch.setattr(math, "pi", 3) math.pi'yi test sırasında 3 yapar; bitince geri alır.

3 monkeypatch metotlarını eşleştir

Kavram Anlamı
setattr Özniteliği değiştirir
setenv Ortam değişkeni koyar
delattr Özniteliği siler
monkeypatch (parametre) Teste enjekte edilir

İleri seviye bölümündeki tüm dersler