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.
Kullanacağımız araçlar;
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"
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;
title
‘ında “Django” olup olmadığını kontrol etmekTestimizi ç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/[...]
“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 $
İ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"
Gelecek Kısım: Python (Django) ile Test Odaklı Geliştirme (TDD) – 2
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.
Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…
Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…
listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…
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…
Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…
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…