Exploring Infinite Possibilities on FrontEnd 🚀
Burak Sağlık
Search...

Tue Aug 04 2026

GUI Scripting'ten ADT REST ve AI ile SAP Otomasyonu Rehberi

GUI Scripting'ten ADT REST ve AI ile SAP Otomasyonu Rehberi

🎯 SAP Otomasyonunun Yolunu Değiştiren Bir Rehber: ADT REST Servisleri ve Yapay Zeka

Merhaba, arkadaşım! 👋 Hazırsan başlayalım.

Bir dakika, sen de SAP geliştiricilerinin her sabah GUI scripting ile o tekrar eden tıklama devrinin içine girdiğini biliyor musun? 🛠 Saatlerce ekranlar arasında sırayla dolaşıp, hata almadan çalışması için sabırsızlanmak gerçekten yıkıcı olabiliyor. İşte tam da bu noktada, SAP otomasyonu dünyamızın bir kurtarıcısı çıkıyor: ADT REST servisleri ve yapay zeka destekli otomasyon.

Peki bu yeni yaklaşım ne diyor bize? 🔁

  • ADT REST servisleri ile SAP içine doğrudan, programatik olarak bağlanıyorsun.
  • Artık ekranları tarayarak değil, API üzerinden veri çekip işleri yürütüyorsun.
  • Yapay zeka ise bu süreçleri akıllıca optimize ediyor, senin için en iyi GUI scripting alternatifi olarak devreye giriyor.

Nasıl çalışıyor? Hadi pratik bir örnekle görelim:

import requests

# SAP ADT REST servisine bağlanma
response = requests.get(
    "https://sap-api.example.com/bapi/...",
    headers={"Authorization": "Bearer token"}
)
print(response.json())

Bu sayede ne oluyor? ❗️ Artık kodu çalıştırdığında, sistem manuel müdahale olmadan SAP'a ulaşıyor ve veriyi alıyor. Manuel tıklama yok, hata riski azalıyor, SAP otomasyonu gerçekten işe yarıyor! ✅

Eğer SAP geliştiricisiysen ve GUI scripting ile kavga etmekten bıktıysan, bu yazı tam da sana lazım. 🎯 İlerleyen bölümlerde ADT REST servislerini ve yapay zekayı nasıl birleştireceğimizi derinlemesine anlatacağım. Hazırsan, gelelim!


❗️ GUI Scripting'in Uzun Soluklu Sorunları: Neden Artık Yeterli Değil?

Hay, biliyorum. Sabahın ilk işin olarak SAP'te bir rapor tetiklemek için o eski GUI scriptine tekrar başvurmak. O scriptin sorunsuz çalıştığı günleri hatırlıyor musun? Şimdi biraz zorlanıyor, değil mi? 🎯

İşte SAP geliştiricilerinin günlük hayatta karşılaştığı başlıca sıkıntılar:

  • Ekran güncellemeleri sonrası script kırılması: SAP bir patch veya yeni versiyon çıkardığında, scriptin başvurduğu butonun ID'si bir şekilde değişiyor. Örneğin, "Ödeme Tamamla" butonunun adı bir gün btn_pay iken, bir gün sonra btn_confirm oluyor. Script hemen çöküyor. ❗️
  • Bakım maliyetinin artması: O scripti çalıştırmak için artık bir SAP uzmanına danışman gerekiyor. Süre uzuyor, maliyet katlanıyor. Kimse bunu sevmiyor. 🛠
  • Okunabilirliğin düşük olması: Bu scriptler neredeyse Record & Playback haritaları gibi. Kimse bu kodu uzun sürede anlayamıyor. Okumak bir cefa. 📖
  • Hata ayıklama zorluğu: Script aniden durduğunda, neden durduğunu anlamak bir harika. Loglar boş, ekran beklediği nesneyi bulamıyor. 😩

Hadi biraz daha derinlemesine girelim... Tüm bu sıkıntılar aslında bizi bir noktaya getiriyor: Uçtan uca otomasyon kavramına. Peki bu tam olarak ne oluyor burada? Nasıl bir çıkış yolu var sence?


🎯 ADT REST Servisleri Nedir ve Neden Bu Kadar Önemli?

Hazırsan başlayalım! ADT, yani SAP Development Tools üzerinden SAP sistemlerine RESTful API ile nasıl bağlandığını merak ediyorsan, buradasın. 🎯 ADT REST servisleri, SAP ABAP nesnelerine (program, tabelar, vs.) HTTP protokolü üzerinden erişmenin modern yoludur.

Peki bu eski GUI scripting'e kıyasla ne farkı var? ❗️ Çok büyük fark var. Bir tıklamayla açtığın ekranları otomatize etmek yerine, doğrudan SAP'in içine yapılandırılabilir istekler atıyoruz. İşte neden bu kadar önemli:

  • Yapılandırılabilirlik: Sadece ihtiyacın olan datayı alırsın. Fazla bilgiyi filtreleyebilirsin.
  • 🔁 Ölçeklenebilirlik: Yüzlerce programı veya tabelayı tek seferde, scriptlerle yönetebilirsin.
  • 🛠 Modern Entegrasyon: CI/CD pipeline'larına veya otomasyon araçlarına rahatlıkla sışırılabilir. Artık el ile tıklamaya gerek yok!

Hadi pratik bir örnek üzerinden anlayalım. Ne oluyor burada? 🛠

curl -X GET -H "Authorization: Bearer <token>" https://<adt-host>/sap/bc/adt/abap/programs/root/Z_MY_PROGRAM

Bu curl komutu ne yapıyor? 🔁

  • Önce Authorization: Bearer <token> ile SAP sistemine kimlik doğrulaması yapıyoruz.
  • Sonra <adt-host> adresine gidip Z_MY_PROGRAM adlı ABAP programını istiyoruz.

Bu sayede ne oluyor? SAP sistemine GUI'den bağlanıp tıklamak yerine, komut satırından veya bir otomasyon script'inden doğrudan program kodunu alıyoruz. ⛔ Manuel hatalar ve yavaşlıklar artık geride kalıyor.

Özetle, ADT REST servisleri SAP'a modern ve hızlı bir şekilde erişmeni sağlıyor. İleriki bölümlerde bu endpoint'leri nasıl daha detaylı kullanacağımızı göreceğiz. 🚀


🔁 Yapay Zeka Otomasyonda Ne Rol Oynuyor? Aklınıza Gelen Her Şeyi Açalım

Hazırsan başlayalım. Yapay zeka SAP otomasyonunda artık bir trend kelime değil, gerçekten işe yarayan bir ekip arkadaşı. Aklına gelen her şeyi açalım.

🔁 Nerede devreye giriyor?

  • 🛠 Kod üretimi: Tekrarlayan ABAP bloklarını yapay zeka yazıyor, sen sadece mantığı belirliyorsun.
  • ❗️ Hata analizi: Loglarda neyin patladığını anlama işini yapıyor, sana kırmızı çizgiyi gösteriyor.
  • Otomatik test senaryoları: Edge case'leri kendisi üretip test kodlarına dökebiliyor.

Peki bu yapay zeka ADT REST servisleriyle nasıl entegre oluyor? Adım adım göstereyim.

  1. ADT REST üzerinden mevcut ABAP kodunu çekiyorsun.
  2. Bu ham kodu yapay zekaya gönderiyorsun.
  3. Yapay zeka refactor önerisi sunuyor.
  4. Öneriyi ADT'ye geri yazıp güncelliyorsun.

Hadi pratik bir örnek üzerinden anlayalım. ADT REST'ten aldığın bir ABAP kod parçasını, OpenAI'ye göndererek refactor önerisi isteyen bir Python snippet'a bak:

import requests

abap_code_from_adt = """
DATA lv_text TYPE string.
lv_text = 'Merhaba'.
"""

payload = {
    "model": "gpt-4",
    "messages": [
        {"role": "system", "content": "Sen ABAP uzmanısın. Bu kodu optimize et ve refactor önerisi ver."},
        {"role": "user", "content": abap_code_from_adt}
    ]
}

response = requests.post(
    "https://api.openai.com/v1/chat/completions",
    json=payload,
    headers={"Authorization": "Bearer YOUR_API_KEY"}
)

Bu sayede ne oluyor? ADT REST'ten aldığınız ham ABAP kodunu doğrudan yapay zekaya yollıyor ve "bu kodu düzelt" diyorsunuz. Yapay zeka size daha temiz, daha sürdürülebilir bir versiyonunu döndürüyor.

Nasıl çalışıyor? ADT REST servisi size kodu veriyor, Python requests.post ile bu kodu LLM'a aktarıyor, LLM size cevap veriyor. Böylece elinizdeki tekrarları bırakıp mantıksal işelere odaklanıyorsunuz.


🛠 Adım Adım Geçiş Rehberi: GUI Scripting'ten ADT REST + Yapay Zeka'ya

1️⃣ Mevcut Scriptlerin Envanterini Çek 📋

Hazırsan başlayalım! Önce elindeki GUI scriptlerini bir listeye koymam lazım. 📋 Hangi adımlar tekrar ediyor, hangileri elle yapılıyor? Burada mutlaka bir tablo oluştur:

  • Script adı ve açıklaması
  • Çalışma süresi
  • Hata riski

2️⃣ ADT REST ile Değiştirilecek Adımları Belirle 🔗

Şimdi de hangi adımların API üzerinden halledilebileceğini görsek iyi olur. 🔁 GUI'yi açıp tıklama yerine, doğrudan ADT REST endpoint'lerini çağırıp işlemi yapalım. ❗️ Dikkat et: Sadece yapısal ve tekrarlayan adımları seç. Karmaşık karar adımlarına şimdilik dokunma.

  • Yapısal adımlar → ADT REST ile değiştir
  • Karmaşık karar adımları → Şimdilik bırak

3️⃣ Yapay Zeka ile Kod Üretimi ve Test Planlaması 🤖

Hadi pratik bir örnek üzerinden anlayalım! 🤖 Yapay zekayı kod yazmak ve test etmek için kullanacağız. Nasıl çalışıyor? İlk olarak AI'a ADT REST endpoint'ini tanımlayıp, ona göre kod parçasını üretletiriz. Sonra da o kodu otomatik test senaryolarıyla doğrularız.

4️⃣ Küçük Bir Pilot Projeyle Başla 🧪

Her şeyi bir anda değiştirmeyelim! 🧪 Küçük, risk düşük bir script ile başla. Bu pilot süreçte ne oluyor? Hız ve güven kazanacağız. Başarısız olursa çok az zarar veririz.

5️⃣ Sonuçları Ölç ve Ölçeklendir 📈

Pilot bittikten sonra ne olduğunu görmem lazım. 📈 Süre kısalıyor mu? Hata oranı düşüyor mu? Bu verileri alıp diğer scriptlere de uygulayalım.

Adım planlaması için basit bir checklist:

{"adim": 1, "aciklama": "Mevcut scriptleri tespit et", "durum": "yapildi"}

---

## 🛠 İlk ADT REST Çağrınızı Yapın: Pratik Bir Kurulum Rehberi

Hadi adım adım ilerleyelim. Bu bölümde **ADT REST servisine** nasıl bağlanacağınızı, **token** nasıl alacağınızı ve ilk **GET** isteğinizi nasıl göndereceğinizi göreceğiz.

---

### 1️⃣ Ön Hazırlık: ADT Kurulumu

ADT'yi (ABAP Development Tools) Eclipse üzerinden kullanıyorsunuz. İhtiyacınız olan şeyler:

- **Eclipse IDE** (ADT plugin ile birlikte)
- **SAP GUI** veya **SAP Logon** ile ABAP sisteminize erişim
- **Sertifika** (SSL bağlantısı için)

ADT'yi ilk kez kuruyorsanız, Eclipse Marketplace'den **"ABAP Development Tools"** eklentisini ekleyin. Kurulumdan sonra Eclipse'i açın ve **ABAP Perspective**'e geçin.

---

### 2️⃣ Sertifika Yapılandırması 🔐

ADT ile REST çağrısı yaparken SSL sertifikası kritik. Adımlar şöyle:

- **SAP Logon**'daki sistem bağlantınızı açın
- Sistem özelliklerine girin → **"Sertifika"** sekmesine gidin
- **SSL sertifikasını** export edin (`.p12` veya `.cer` formatında)
- Bu sertifikayı projenize aşağıdaki gibi ekleyin:

proje_kökü/ ├── config/ │ └── sertifika.p12 ├── src/ │ └── main.py └── requirements.txt


- `sertifika.p12` dosyasını `config/` klasörüne koyun. Bu dosya token alma sırasında SSL doğrulaması için kullanılacak.

**❗️ Dikkat:** Eğer sertifika yoksa, ADT REST servisi size `SSL handshake failed` hatası verecektir.

---

### 3️⃣ Token Alma: Kimlik Doğrulaması 🔁

ADT REST servisi **token-based authentication** kullanır. Yani her istek öncesinde bir token almanız ve header'a ekmeniz gerekiyor.

Token alma için kullanacağınız endpoint genelde şöyle bir formatta olur:

https://:/sap/bc/adt/oauth2/token


Burada **client_id** ve **client_secret** değerlerinizi ABAP sisteminde tanımlı servis kullanıcısı bilgileriyle birlikte gönderiyorsunuz.

---

### 4️⃣ İlk GET İsteği: ABAP Program Listesi Çekme 🎯

Token'ı aldıktan sonra artık istek göndermeye hazırız. Hadi bir Python script'i yazalım:

```python
import requests
import json

# --- Yapılandırma ---
ADT_HOST = "your-adt-host.example.com"
ADT_PORT = "443"
BASE_URL = f"https://{ADT_HOST}:{ADT_PORT}/sap/bc/adt"

CLIENT_ID = "your-client-id"
CLIENT_SECRET = "your-client-secret"
AUTH_URL = f"{BASE_URL}/oauth2/token"
PROGRAMS_URL = f"{BASE_URL}/abap/programs"

# --- Adım 1: Token Alma ---
print("🔑 Token alınıyor...")
auth_response = requests.post(
    AUTH_URL,
    data={"grant_type": "client_credentials"},
    auth=(CLIENT_ID, CLIENT_SECRET),
    verify="config/sertifika.p12",  # SSL sertifikası yolu
    headers={"Content-Type": "application/x-www-form-urlencoded"}
)

if auth_response.status_code != 200:
    print(f"❌ Token alma başarısız! Status: {auth_response.status_code}")
    print(auth_response.text)
    exit(1)

token_data = auth_response.json()
access_token = token_data.get("access_token")
print("✅ Token başarıyla alındı!")

# --- Adım 2: ABAP Program Listesi Çekme ---
print("📋 ABAP program listesi çekiliyor...")
headers = {
    "Authorization": f"Bearer {access_token}",
    "Accept": "application/json"
}

programs_response = requests.get(
    PROGRAMS_URL,
    headers=headers,
    verify="config/sertifika.p12",
    params={"max_items": "50"}
)

if programs_response.status_code != 200:
    print(f"❌ İstek başarısız! Status: {programs_response.status_code}")
    print(programs_response.text)
    exit(1)

programs = programs_response.json()
print(f"✅ {len(programs.get('programs', []))} program listelendi.")
print(json.dumps(programs, indent=2, ensure_ascii=False))

Nasıl çalışıyor?

  • İlk olarak POST ile token endpoint'ine istek atıyoruz. auth=(CLIENT_ID, CLIENT_SECRET) ile HTTP Basic Auth yapıyoruz.
  • verify parametresinde sertifika dosyamızı gösteriyoruz — böylece SSL bağlantısı güvenli kapanıyor.
  • Token'ı aldıktan sonra Authorization: Bearer <token> header'ı ile GET isteği gönderiyoruz.
  • JSON response'u json() metoduyla parse edip ekrana yazdırıyoruz.

5️⃣ Çok Karşılaşabileceğiniz Hatalar ❗️

Hata Sebep Çözüm
SSL: CERTIFICATE_VERIFY_FAILED Sertifika yolu yanlış veya sertifika eksik verify parametresine doğru .p12 dosya yolunu verin
401 Unauthorized Token alınamadı, client_id/secret yanlış SAP Logon'daki servis kullanıcı bilgilerini kontrol edin
403 Forbidden Yetki yetersiz Kullanıcınızın ADT REST servisine erişim iznine sahip olduğundan emin olun
Connection refused Host veya port yanlış ADT sunucu adresi ve port numarasını kontrol edin
Timeout Ağ gecikmesi requests.get(..., timeout=30) ekleyerek timeout süresini ayarlayın

6️⃣ requirements.txt

Projede kullanacağınız kütüphane:

requests>=2.28.0

Kurulum için:

pip install -r requirements.txt

Bu kadar! Script'i çalıştırdığınızda token alıp ABAP program listenizi JSON formatında görmeniz gerekiyor. Bir sonraki bölümde POST isteği ile yeni bir program nasıl oluşturacağımızı göreceğiz. Hazırsan bir sonraki başlığa geçelim 🚀


🛠 Yapay Zeka ile Uçtan Uca Otomasyon Akışını Oluşturun

Hazırsan başlayalım. ADT REST servislerini yapay zekayla nasıl zincirleyerek bir otomasyon akışı kuracağımızı anlatıyorum. Enterprise yazılım dünyasında bu, tekrarlanabilir ve hata payını azaltan bir yaklaşım. 🎯

Akış şemasını dört adımda parçalayalım:

  • ADT REST ile kod çekme 🔁

    • ADT REST API'sinden hedef ABAP objenin kodunu alıyoruz.
    • 🛠 Araç: ADT REST (/sap/bc/adt/... endpoint'leri).
    • Burada repository ve object path'lerini kullanarak raw kod'u JSON formatında çeşiyoruz.
  • Yapay zeka ile analiz/refactor 🧠

    • Çektiğimiz kodu bir LLM API'ye (OpenAI, Azure OpenAI vb.) gönderiyoruz.
    • ❗️ Dikkat: Prompt mühendisliği kritik. "Bu ABAP kodu SOLID prensiplerine uygun hale getir" gibi net komutlar veriyoruz.
    • Yapay zeka analiz önerisini döndürüyor.
  • ADT REST ile test senaryosu oluşturma 📝

    • Yapay zekanın önerdiği değişiklikleri temel alarak ADT REST üzerinden otomatik test senaryoları üretiyoruz.
    • 🛠 Araç: ADT REST + ABAP Unit Test Framework.
    • Otomatik olarak LOCAL CLASS testleri oluşturuluyor ve ADT'e geri yükleniyor.
  • Otomatik deploy ve doğrulama

    • Oluşturulan test senaryolarıyla birlikte kodu prod ortamına deploy ediyoruz.
    • CI/CD pipeline (Jenkins, GitLab CI) ADT REST deploy endpoint'ini tetikliyor.
    • ⛔ Hata varsa pipeline duruyor, yoksa doğrulama başarılı oluyor.

Hadi pratik bir örnek üzerinden bu zincirin nasıl çalıştığını görelim. Aşağıdaki Python script'i bu üç temel adımı (çekme, zekaya gönderme, geri gönderme) tek bir orchestration script'inde birleştiriyor.

Ne oluyor burada? İlk fonksiyon ADT'ten kodu çeker, ikincisi bu kodu yapay zekaya gönderip iyileştirilmiş versiyonunu alır, üçüncüsü ise bu öneriyi tekrar ADT REST üzerinden sisteme geri gönderir.

import requests
import json

# ADT REST ve LLM ayarları
ADT_BASE_URL = "https://adt.example.com/sap/bc/adt"
LLM_API_URL = "https://api.openai.com/v1/chat/completions"
HEADERS_ADT = {
    "Authorization": "Bearer <ADT_TOKEN>",
    "Content-Type": "application/json"
}
HEADERS_LLM = {
    "Authorization": "Bearer <LLM_API_KEY>",
    "Content-Type": "application/json"
}

def fetch_abap_from_adt(package_name, object_name):
    """ADT REST'ten ABAP kodu çekiyor."""
    url = f"{ADT_BASE_URL}/repository/objects/{package_name}/{object_name}/source/main"
    response = requests.get(url, headers=HEADERS_ADT)
    response.raise_for_status()
    return response.json().get("source", "")

def analyze_with_llm(abap_code):
    """Yapay zekaya kod gönderip refactor önerisi alıyor."""
    payload = {
        "model": "gpt-4",
        "messages": [
            {
                "role": "system",
                "content": "Sen bir ABAP uzmanısın. Gelen kodu optimize et ve SOLID prensiplerine uygun hale getir."
            },
            {
                "role": "user",
                "content": abap_code
            }
        ]
    }
    response = requests.post(LLM_API_URL, headers=HEADERS_LLM, json=payload)
    response.raise_for_status()
    return response.json()["choices"][0]["message"]["content"]

def push_refactored_code_to_adt(package_name, object_name, refactored_code):
    """Yapay zekanın önerdiği kodu ADT REST üzerinden sisteme gönderiyor."""
    url = f"{ADT_BASE_URL}/repository/objects/{package_name}/{object_name}/source/main"
    payload = {"source": refactored_code}
    response = requests.put(url, headers=HEADERS_ADT, json=payload)
    response.raise_for_status()
    return response.status_code

# Workflow Orkestrasyonu
if __name__ == "__main__":
    package = "Z_AUTOMATION_PACKAGE"
    obj = "Z_MY_ABAP_CLASS"

    # 1. ADT'den kod çek
    original_code = fetch_abap_from_adt(package, obj)

    # 2. Yapay zekaya gönder ve öneri al
    refactored_code = analyze_with_llm(original_code)

    # 3. ADT'ye geri gönder
    status = push_refactored_code_to_adt(package, obj, refactored_code)

    print(f"Kod başarıyla güncellendi. HTTP Status: {status}")

Bu sayede ne oluyor? Manuel olarak kodu kopyala-yapıştır etmeye gerek kalmıyor. ADT REST servisleri ile yapay zeka arasında otomatik bir veri akışı kuruyoruz. Enterprise ortamda bu, hız ve tutarlılık demek. 🚀


🔁 Uçtan Uca Otomasyonunuzu Test Edin: Hata Bulma ve Ölçüm Stratejileri

Otomasyon akışını yazdın, çalışıyor dedin — ama gerçekten her adım doğru mu çalışıyor? Bir endpoint değiştiğinde, bir middleware'de sessizce hata saklendiğinde, seni ne biliyor? İşte tam da bu noktada test stratejinin devreye girmesi gerekiyor.

🎯 Neden Test Etmeliyiz?

  • Hata bulma erken olur — senin kodunda değil, senin akışında nerede kırıldığını görürsün.
  • Regresyon korkusu azalır — bir şey değiştiğinde, hızlıca tüm patikalarda çalıştığını teyit edersin.
  • Ölçüm elde edersin — kaçı test geçti, kaçı kırıldığını sayılarla konuşursun.

🛠 Üç Aşama, Üç Farklı Bakış Açısı

1. Unit Test — Temel Taşları Kontrol Et

Her fonksiyonu, her servisi ayrı ayrı test et. Bağımlılıkları mock edersin, sadece o birimin davranışına bakarsın.

  • Fonksiyon beklenen değeri döner mi?
  • Hata durumunda doğru exception fırlatıyor mu?
  • Edge case'ler ele alınıyor mu?

2. Integration Test — Parçalar Arası Bağlantıyı Test Et

Birkaç modül bir araya geldiğinde ne oluyor? Burada gerçek servislere (veya onların mock'larına) bağlanırsın.

  • REST endpoint'leri birbirini doğru mi tanıyor?
  • Veri formatı geçişlerinde kayıp var mı?
  • Timeout ve retry mekanizmaları çalışıyor mu?

3. End-to-End Test — Tüm Akışı Tek Bir Çatı Altında

Başlangıçtan sona kadar her şeyin birlikte çalıştığını görürsün.

  • Kullanıcı senaryosu tam olarak izleniyor mu?
  • Sonuçta beklenen çıktı üretiliyor mu?
  • Hata yönetim zinciri doğru mu kuruluyor?

🤖 Yapay Zeka Destekli Test Senaryo Oluşturma

Şimdi gelin geleceğe bir adım atalım. Yapay zeka, test senaryo oluşturmayı tamamen farklı bir seviyeye taşıyor:

  • Otomatik senaryo üretimi — AI, API dokümantasyonunu ve geçmiş istekleri analiz ederek senaryolar üretir. Sen sadece onları onaylarsın.
  • Anomalik desen tespiti — normalden sapma var mı? AI bunu senin gözlerinin önüne serer.
  • Dinamik senaryo çeşitliliği — el ile yazdığın senaryolar genelde "mutlu yol" senaryosu olur. AI, olumsuz senaryoları, köşe durumlarını da üretebilir.

Bu sayede test kapsamını genişletirsin, ama elinden gelen her senaryoyu tek tek yazmak zorunda kalmazsın.

❗️ GUI Scripting'e Kıyasla Neden Bu Daha İyi?

GUI tabanlı otomasyon test yazmak bir hayvan. Buton tıkla, gör, geç. Ama:

  • Görsel değişiklik bir testi kırabilir — CSS sadece renk değiştirdi, testin düştü.
  • Bakım maliyeti yüksek — her UI güncellemesi seni geri getirir.
  • Hız yavaş — gerçek tarayıcı açılır, render olur, beklenir.

REST API bazlı otomasyon testleri ise:

  • Hızlı — HTTP isteği at, yanıt gel, kontrol et.
  • Güvenilir — görsel bağımlılıktan kurtulursun, sadece veri akışına bakarsın.
  • Sürdürülebilir — endpoint değişmedikçe testler çalışmaya devam eder.

Yani GUI scripting yerine API bazlı test stratejisi seçtiğinde, hem güvenilirlik hem de bakım kolaylığı kazanıyorsun.

📝 Pratik Bir Örnek: pytest ile ADT Endpoint'lerini Mock'leyelim

Şimdi basit bir pytest senaryosu yazalım. ADT REST endpoint'lerini mock ediyoruz ve otomasyon akışının her adımını kontrol ediyoruz.

import pytest
from unittest.mock import patch, MagicMock

# Mock ADT REST endpoint'leri
MOCK_ADT_ENDPOINTS = {
    "/api/v1/tasks": {"status": 200, "body": {"tasks": [{"id": 1, "name": "test_task"}]}},
    "/api/v1/tasks/1": {"status": 200, "body": {"id": 1, "name": "test_task", "status": "completed"}},
    "/api/v1/tasks/1/complete": {"status": 200, "body": {"id": 1, "status": "completed"}},
}

def mock_get(endpoint):
    """GET istekleri için mock response üretir."""
    if endpoint in MOCK_ADT_ENDPOINTS:
        return MagicMock(status_code=MOCK_ADT_ENDPOINTS[endpoint]["status"],
                         json=MagicMock(return_value=MOCK_ADT_ENDPOINTS[endpoint]["body"]))
    return MagicMock(status_code=404)

def mock_post(endpoint):
    """POST istekleri için mock response üretir."""
    if endpoint in MOCK_ADT_ENDPOINTS:
        return MagicMock(status_code=MOCK_ADT_ENDPOINTS[endpoint]["status"],
                         json=MagicMock(return_value=MOCK_ADT_ENDPOINTS[endpoint]["body"]))
    return MagicMock(status_code=500)

def run_automation_flow():
    """
    Otomasyon akışı:
    1. Görevleri listele
    2. İlk görevin detaylarını al
    3. Görevi tamamla
    """
    import requests

    # Adım 1: Görevleri listele
    resp1 = requests.get("http://adt-api.local/api/v1/tasks")
    tasks = resp1.json()["tasks"]
    assert len(tasks) > 0, "Görev listesi boş geldi"

    # Adım 2: İlk görevin detaylarını al
    task_id = tasks[0]["id"]
    resp2 = requests.get(f"http://adt-api.local/api/v1/tasks/{task_id}")
    task_detail = resp2.json()
    assert task_detail["id"] == task_id

    # Adım 3: Görevi tamamla
    resp3 = requests.post(f"http://adt-api.local/api/v1/tasks/{task_id}/complete")
    result = resp3.json()
    assert result["status"] == "completed"

    return True

# --- Test Senaryoları ---

class TestAutomationFlow:
    @patch("requests.get", side_effect=mock_get)
    @patch("requests.post", side_effect=mock_post)
    def test_full_flow_succeeds(self, mock_post_fn, mock_get_fn):
        """Tüm akış adımları başarılı şekilde tamamlanır mı?"""
        result = run_automation_flow()
        assert result is True

    @patch("requests.get", side_effect=mock_get)
    @patch("requests.post", side_effect=mock_post)
    def test_task_list_not_empty(self, mock_post_fn, mock_get_fn):
        """Görev listesi boş gelmemeli."""
        import requests
        resp = requests.get("http://adt-api.local/api/v1/tasks")
        assert len(resp.json()["tasks"]) > 0

    @patch("requests.get", side_effect=mock_get)
    @patch("requests.post", side_effect=mock_post)
    def test_task_completion_status(self, mock_post_fn, mock_get_fn):
        """Görev tamamlandığında status 'completed' olmalı."""
        import requests
        resp = requests.post("http://adt-api.local/api/v1/tasks/1/complete")
        assert resp.json()["status"] == "completed"

    @patch("requests.get", return_value=MagicMock(status_code=500))
    def test_get_failure_handled(self, mock_get_fn):
        """GET isteği başarısız olursa doğru hata yönetimi yapılıyor mu?"""
        with pytest.raises(AssertionError):
            run_automation_flow()

Bu sayede ne oluyor? Her bir test senaryosu, otomasyon akışının birer adımını izler ve mock'lanmış endpoint'lerle gerçek sunucuya bağlanmadan kontrol eder. test_full_flow_succeeds tüm akışı tek seferde çalıştırır, test_task_completion_status ise sadece tamamlama adımını izole eder. Hata neredeyse ise, o adımın testinde görürsün.

🚀 Bir Sonraki Seviyeye Geçelim

Şimdi kadar çok şey kavradın — mock'lar, senaryo katmanları, AI desteği. Ama bu sadece temel taş. Bir sonraki bölümde, bu testleri CI/CD pipeline'a entegre etmeyi ve test raporlarını gerçek zamanlı dashboard'larla görselleştirmeyi öğreneceğiz. Hazırsan, bir sonraki adımda buluşalım. 🎯


❗️ Dikkat Edilmesi Gereken Tuzaklar ve Yayılan Yanlış Anlamalar

ADT REST servislerine geçiş yaparken kafan biraz karışabilir, bu tamamen normal. 🎯 Sık karşılaşılan tuzakları ve yanılgıları tek tek gezelim, böylece önceden hazırlanmış olursun.

🔁 Token Süresi ve Yetki Hataları

  • ADT servislerine istek atarken token'ın ömrü bitmiş olabilir. 401 Unauthorized hatası alırsın. ❗️
  • Çözüm: Token'ı otomatik yenilemek için bir refresh token döngüsü kur. İşte nasıl yapılıyor:
# Token yenileme örneği
if response.status_code == 401:
    yeni_token = token_yenile()
    request_headers["Authorization"] = f"Bearer {yeni_token}"

Bu sayede ne oluyor? Token tükendiğinde elle müdahale etmeden, sistem otomatik olarak yenisini alır ve istek tekrar gönderilir. ✅

⛔ Rate Limiting Tuzakları

  • ADT servisleri çok fazla istek atanı seni geçici olarak kapatabilir. 429 Too Many Requests geliyor.
  • Çözüm: Exponential back-off stratejisi uygula. Yani hızlıca tekrar deneme, biraz bekle, tekrar dene.
  • Bu sayede ne oluyor? Sunucuyu yoğutmadan, sana hak ettiğin cevabı alırsın. 🛠

🧠 Yapay Zeka Çıktılarını Doğrulama

  • AI'dan gelen cevaplar her zaman doğru olmayabilir. Hallüsinasyon denen bir durum var. ❗️
  • Çözüm: AI çıktısını kendi veri şemanla karşılaştır. Eğer beklenmeyen bir alan gelirse atla veya flag'le.
  • Nasıl çalışıyor? AI kadar hızlı değil ama güvenilir bir kontrol mekanizması kurarsın. ✅

🚧 Geçiş Sürecinde Atlanan Kritik Adımlar

  • Eski sistemden yeni ADT'ye veri taşırken veri tipleri veya zaman damgaları uyuşmayabilir.
  • Çözüm: Geçiş öncesi bir mapping tablosu oluştur. Hangi eski alanın yeni alana geldiğini mutlaka yaz.
  • Bu sayede ne oluyor? İlk başta küçük bir kontrol sayesinde büyük bir veri kaybını önlersin. 🎯

🎯 Özet: SAP Otomasyonunuzun Yeni Bölümüne Hoş Geldiniz

Hazırsan başlayalım! 🔁 Bu bölümde ana mesajı özetliyorum.

SAP otomasyonu ve ADT REST servisleri birlikte çağrışımında ne oluyor? 🛠

  • ADT REST servisleri ve yapay zeka birlikte kullanıldığında, SAP otomasyonu tamamen dönüşüyor.
  • Artık GUI scripting alternatifi olarak daha akıllı ve doğrudan entegrasyonlar yapıyorsun.
  • Bu sayede uçtan uca otomasyon mümkün oluyor.
  • Enterprise yazılım otomasyonu artık korkutucu bir dünya değil. ✅

Nasıl çalışıyor? ADT REST servisleri üzerinden SAP'e doğrudan bağlanıyorsun. Yapay zeka ise bu bağlantıları optimize ediyor ve hataları azaltıyor. Böylece elle tıklamaya gerek kalmıyor.

❗️ Sonuç? Artık başlayabilirsin. Bu araçlarla SAP otomasyonu çok daha hızlı ve erişilebilir hale geliyor. Hazırsan başlayalım! 💪


🎁 Bonus Tavsiye: Sizden Daha Fazlasını Keşfedin

Sevgili okur, bu yazının sonuna geldiğinde bir şeyi kesinlikle yapmanızı istiyorum. Çünkü bu bölüm sadece teorik bir bonus değil — hemen bugün uygulayabileceğiniz küçük ama güçlü bir adım. 🛠

🔍 ADT REST Servisleri İçin Kaynaklar

ADT ile çalışırken karşınıza çıkabilecek en yaygın sorular bunlar:

  • Postman ile ADT REST endpoint'lerinizi hızlıca test edebilirsiniz — koleksiyon paylaşımı için Postman Workspace kullanmak çok pratik.
  • Swagger / OpenAPI dokümantasyonu oluşturmayı ihmal etmeyin; takımınızın API'yi anlamasını çok kolaylaştırır.
  • Oracle'un resmi REST Data Services (ORDS) dokümantasyonu, hızlı başlangıç için en güncel kaynaktır.
  • GitHub üzerinde ADT örnek projeleri aradığınızda oracle/adt-samples reposu harika bir başlangıç noktası.

🤖 Yapay Zeka Araçlarının Karşılaştırması

ADT REST servis geliştirme sürecinde size yardımcı olabilecek birkaç AI aracı:

  • GitHub Copilot: Kod yazarken endpoint tanımları ve SQL sorguları için hızlı öneriler sunar. ✅
  • ChatGPT: Hata mesajlarını analiz etmek ve çözüm üretmek için mükemmel bir "pair programmer" rolü üstlenir. 🔁
  • Cursor IDE: Kod tabanınızı anlayıp ADT yapılandırmalarında otomatik düzeltmeler önerebilir. 🎯

İpucu: Bu araçları tek başına değil, birlikte kullanın. Önce Copilot ile kodunuzu yazın, sonra ChatGPT ile hata ayıklamasını isteyin — bu kombinasyon inanılmaz bir hız kazandırır.

🚀 Bugün Hemen Yapabileceğiniz Bir Şey

İşte küçük ama etkili bir adım:

  1. Bir Postman koleksiyonu oluşturun.
  2. ADT REST servisinizin temel üç endpoint'ini (GET, POST, PUT) ekleyin.
  3. Her birini çalıştırıp gelen yanıtı not edin.

Bu kadar. 🎯

Bu üç adım, size ADT REST mimarisini somut bir şekilde tanıyacaktır. Teorik bilgiyi artık pratikte görmüş olacaksınız.

💬 Son Söz

Bu yolculukta yalnız değilsiniz. Buradan sonra her şeyi adım adım takip edeceğiz — sorularınızı sormaktan çekinmeyin, çünkü her soru bir adım ilerlemedir. Haydi, ADT REST servislerinizi keşfetmeye başlayın — siz bunu yapabilirsiniz! 🚀


Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.

Burak Sağlık

Burak Saglik

©2024 Desing and Developed by @Burak Sağlık

All rights reserved