Categories: Python

Python (Django) ile Test Odaklı Geliştirme (TDD) – 1

Bölüm 1:  TDD Temelleri ve Django (Part 1: The Basics of TDD and Django)

Bu bölümde, Test-Driven Development (TDD) temellerine giriş yapıp, sıfırdan bir web uygulaması yapacağız. Her aşamada önceliğimiz test yazmak.

Hazırlık

Kullanacağımız araçlar;

  • Firefox
  • Geckodriver
  • GIT

Python 3 ile sanal ortam (venv) oluşturup Django 1.11 ve Selenium yükleyeceğiz. (Ben kitaptaki gibi python-tdd-book isimli bir klasör  altında projemi saklayacağım. Fakat sanal ortam oluştururken virtualenv olarak isimlendirmemiz tavsiye ediliyor.)

$ cd python-tdd-book
$ python3.6 -m venv virtualenv
$ source virtualenv/bin/activate

(virtualenv) $ pip install "django<1.12" "selenium<4"

 

​Kısım 1: Functional Test Kullanarak Django Kurulumu (Chapter 1: Getting Django Set Up Using a Functional Test)

Test odaklı geliştirme yaparken, ilk adım hep aynıdır; test yaz.

Önce testi yazarız, sonra çalıştırıp -beklenildiği üzere- hata verip vermediğini kontrol ederiz. Ondan sonra uygulamamızı geliştirmeye devam ederiz. Bu sürece alışmak için kafamızın içinde, sürekli “önce test! önce test!” diye bağıran bir keçi beslemek yardımcı olacaktır 🙂 .

Diğer kuralımız ise, adım adım ilerlemek.

Güzel küçük adımlarla ilerlememiz gerekiyor. Django ile uygulamamızı geliştireceğiz bu eğitimde. Dolayısıyla ilk yapmak isteyeceğimiz şey, Django’yu kurup kuramadığımızı ve çalışmaya hazır olup olmadığını kontrol etmek. İzleyeceğimiz yöntem şöyle;

Django geliştirme sunucusunu çalıştırıp, tarayıcıyı açacağız ve Django’nun web sayfasını döndürüp döndürmediğini kontrol edeceğiz. Bunun için de Selenium kullanacağız.

Projeyi saklamak istediğimiz dizine gidip, functional_tests.py adında dosya oluşturuyoruz ve şu kodları yazıyoruz; (kafanızda “önce test” diye bağıran keçi sesi çıkarmayı ihmal etmeyin 😀 )

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://localhost:8000')

assert 'Django' in browser.title

Yukarıda yaptığımız;

  • Selenium ile, local ortamımızda gerçek bir Firefox penceresi açmak
  • Django’dan döndürmesini umduğumuz web sayfasına gitmek
  • Web sayfasının title‘ında “Django” olup olmadığını kontrol etmek

Testimizi çalıştırıyoruz;

$ python functional_tests.py
  File ".../selenium/webdriver/remote/webdriver.py", line 324, in get
    self.execute(Command.GET, {'url': url})
  File ".../selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File ".../selenium/webdriver/remote/errorhandler.py", line 237, in
check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: abo
ut:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/[...]
Sorun değil Firefox, bunlar hep beklediğimiz hatalar…

“Unable to connect” yazan bir Firefox penceresine bakıyor olmamız lazım. Terminalde ise şuna benzer bir hata çıktısı olması gerek;

File ".../selenium/webdriver/remote/webdriver.py", line 324, in get
    self.execute(Command.GET, {'url': url})
  File ".../selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File ".../selenium/webdriver/remote/errorhandler.py", line 237, in
check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: abo
ut:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/[...]

Testimizden hatamızı aldığımıza göre, uygulamamızı yapmaya başlayabiliriz. “superlist” isimli bir Django uygulaması oluşturuyoruz. Sondaki “.“yı gözden kaçırmayın;

$ django-admin.py startproject superlists .

Proje dizinimiz şöyle bir şey olmalı;

├── functional_tests.py
├── geckodriver.log
├── manage.py
├── superlists
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── virtualenv
    ├── [...]

Uygulama çalışmaya hazır durumda. Django’nun geliştirme sunucusunu ayağa kaldırıp…

$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until
you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

Django version 1.11.3, using settings 'superlists.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

… başka bir terminalde testimizi tekrar çalıştıralım;

$ python functional_tests.py
$
It worked!

İnsanlık için minicik ama bizim için büyük bir adım; ilk testimizi tamamlamış olduk. Birinci kısmın sonuna gelirken, yapmamız gereken tek bir şey daha var: “Commit

$ git init .
Initialised empty Git repository in ...python-tdd-book/.git/

.gitignore‘a log dosyalarını, virtualenv dizinini, db.sqlite3‘ü , __pycache__, *.pyc  vb… gerekli gördüğünüz diğer dosya  ve dizinleri eklemeyi unutmayın. Örnek .gitignore;

.vscode
db.sqlite3
*.log
virtualenv
__pycache__
*.pyc
$ git add .
$ git commit -m "first functional test and basic DJ config"
Aferin, bugünlük bu kadar yeter

Gelecek Kısım:  Python (Django) ile Test Odaklı Geliştirme (TDD) – 2

Not;

Bu yazı, Test-Driven Development with Python: Obey the Testing Goat: Using Django, Selenium, and JavaScript kitabının, yazarından da onayı alınarak, geniş şekilde Türkçe olarak özetlenmiş halidir. Kitabı okumaya ücretsiz olarak devam edebilir, destek olmak için satın alabilirsiniz. Detaylar için buraya tıklayabilirsiniz.

Share
Published by
yusufkaracin

Recent Posts

Celery Checklist [Python]

Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…

5 yıl ago

JavaScript Dizileri için 13 İpucu

Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…

5 yıl ago

List & Tuple Mini Test (Python)

listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…

5 yıl ago

Bilmeniz Gereken 11 Python Mülakat Sorusu

Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…

5 yıl ago

Angular Componentlere Konsol Üzerinden Hızlı Erişim

Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…

5 yıl ago

Birkaç Güzel JavaScript Sorusu İster Miydiniz?

Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…

5 yıl ago