Archive for the ‘ Test Güdümlü Yazılım(Test Driven Development) ’ Category

//www.ethemsulan.com
package Yonetim;
import Robotlar.*;
public class Engine extends EngineSuperSinif{
	public Engine(){
//super() ile ust sinif(extends edilen sinif) yapicisi cagriliyor
		super();
		r1Obj=new Robot1();
		r1Obj.setLocation1(0);
		r2Obj=new Robot2();
		r2Obj.setLocation2(19);
	}
public static void main(String[] args) {
//threadi baslatiyor.yani run() metodunu cagirir
		new Engine().start();
	}
//Baska uygulamanin erisilmesini engelledik(synchronized)
	public void run() {
		synchronized (r1Obj) {
//Robot1'in enerjisi ve paylasimi yapiliyor.
//Enerji<=0 oldugunda thread durduluyor
	r1Obj.unit1Dagit();
	firstLocation=r1Obj.getLocation1();
System.out.println("Robot1'in yeni konumu : "+firstLocation);
    secondLocation=r1Obj.degerDagit1(10, 0);
    r1Obj.setLocation1(secondLocation);    
harEnerHarc1(firstLocation, secondLocation);
if(saldir1()==0){
System.out.println("Robot2 etki alani disinda");
}else{
System.out.println("Robot1'in fuze etkisi : "+saldir1());
      }
if(r1Obj.getEnergy1()<=0){
System.out.println("Birinci thread yani ROBOT1 oldu");
            	this.stop();
            }
   System.out.println();
 try {
	this.sleep((int)(Math.random()*1000));
	} catch (InterruptedException e) {
				e.printStackTrace();
		}
}
//Robot2'nin enerji dagilmi ve hareketi kontrol ediliyor
synchronized (r2Obj) {
	r2Obj.unit2Dagit();
firstLocation=r2Obj.degerDagit2(19, 10);
System.out.println("Robot2'in yeni konumu : "+firstLocation);
secondLocation=rast.nextInt(10);
r2Obj.setLocation2(secondLocation);    
harEnerHarc2(firstLocation, secondLocation);
if(saldir2()==0){
System.out.println("Robot1 etki alani disinda");
}else{
System.out.println("Robot2'nin fuze " +
		"etkisi : "+saldir2());
     }
if(r2Obj.getEnergy2()<=0){
System.out.println("Ikinci thread yani ROBOT2 oldu");
            	this.stop();
            }
System.out.println();
try {
this.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
	e.printStackTrace();
			}	
		}
//surekli kendi icinde cagiriyoruz threadi
            run();	
	}
}
//-------------------------------------------------------------------
//www.ethemsulan.com
package Yonetim;
import java.util.Random;
import Robotlar.Robot1;
import Robotlar.Robot2;
public class EngineSuperSinif extends Thread {
	protected Robot1 r1Obj;
	protected Robot2 r2Obj;
	protected Random rast = new Random();
	protected int firstLocation;
	protected int secondLocation;
	private int mermiHasar;
public EngineSuperSinif() {
		super();
	}
public EngineSuperSinif(Runnable arg0) {
		super(arg0);
	}
public EngineSuperSinif(String arg0) {
		super(arg0);
	}
public EngineSuperSinif(ThreadGroup arg0, Runnable arg1) {
		super(arg0, arg1);
	}
public EngineSuperSinif(ThreadGroup arg0, String arg1) {
		super(arg0, arg1);
	}
public EngineSuperSinif(Runnable arg0, String arg1) {
		super(arg0, arg1);
	}
public EngineSuperSinif(ThreadGroup arg0, Runnable arg1, String arg2) {
		super(arg0, arg1, arg2);
	}
public int harEnerHarc1(int ilkKonum, int sonKonum) {
r1Obj.setEnergy1((Math.abs(ilkKonum-sonKonum)/
		r1Obj.getSpeed1())*5);
		return r1Obj.getEnergy1();
	}
public int harEnerHarc2(int ilkKonum, int sonKonum) {
r2Obj.setEnergy2((Math.abs(ilkKonum-sonKonum)/r2Obj.getSpeed2())*5);
		return r2Obj.getEnergy2();
	}
public EngineSuperSinif(ThreadGroup arg0, Runnable arg1, String arg2,
			long arg3) {
		super(arg0, arg1, arg2, arg3);
	}
public int saldir1() {
mermiHasar=((rast.nextInt(10)+1)*r1Obj.getAttact1()/
r1Obj.getSpeed1()-(r2Obj.getDefense2()*r2Obj.getLocation2()/10));
	if(mermiHasar>0){
		r1Obj.setEnergy1(mermiHasar);
		return mermiHasar;
		}
		return 0;
	}
public int saldir2() {
mermiHasar=((rast.nextInt(10)+1)*r2Obj.getAttact2()/
r2Obj.getSpeed2()-(r1Obj.getDefense1()*r1Obj.getLocation1()/10));
	if(mermiHasar>0){
		r2Obj.setEnergy2(mermiHasar);
		return mermiHasar;
		}
		return 0;
	}
}

Projenin rapidshare linki : http://rapidshare.com/files/369705681/Engine.zip.html

Ana Sayfa: http://www.ethemsulan.com/2010/03/cevik-surec-agile-process-ile-javada.html

//www.ethemsulan.com
package Robotlar;
public class Robot1 extends Robot1SuperSinif {
public boolean unit1Dagit(){
if(getEnergy1()>0){
	dagilimiYap=getEnergy1()/3;
setAttact1(degerDagit1(dagilimiYap,
	dagilimiYap-4>0 ? dagilimiYap-4:1));
dagilimiYap=getEnergy1()-dagilimiYap;
	dagilimiYap=dagilimiYap/2;
setDefense1(degerDagit1(dagilimiYap,
	dagilimiYap-4>0 ? dagilimiYap-4:1));	
setSpeed1(degerDagit1(dagilimiYap,
	dagilimiYap-4>0 ? dagilimiYap-4:1));
dagilimiYap=getEnergy1()-getAttact1()-getSpeed1()-getDefense1();
	int kalanEnerEkle=rastgele.nextInt(3);
if(kalanEnerEkle==0 && dagilimiYap>0){
	setAttact1(getAttact1()+dagilimiYap);
}else if(kalanEnerEkle==1 && dagilimiYap>0){
	setDefense1(getDefense1()+dagilimiYap);
}else if(kalanEnerEkle==2 && dagilimiYap>0){
	setSpeed1(getSpeed1()+dagilimiYap);
		}
		return true;
		}
		return false;
	} }
//-------------------------------------------------------------------
//www.ethemsulan.com
package Robotlar;
import java.util.Random;
public class Robot1SuperSinif {
	private int attact1;
	private int defense1;
	private int speed1 = 2;
	private int location1;
	protected static int energy1 = 100;
public static void setEnergy1(int energy1) {
		Robot1.energy1 -=energy1;
	}
	public void setAttact1(int attact1) {
		this.attact1 = attact1;
	}
public void setDefense1(int defense1) {
		this.defense1 = defense1;
	}
public void setSpeed1(int speed1) {
		this.speed1 = speed1;
	}
public int getAttact1() {
		return attact1;
	}
public int getDefense1() {
		return defense1;
	}
public int getSpeed1() {
		return speed1;
	}
public static int getEnergy1() {
		return energy1;
	}
public int getLocation1() {
		return location1;
	}
public void setLocation1(int location1) {
		this.location1 = location1;
	}
protected Random rastgele = new Random();
protected int dagilimiYap = 0;
public int degerDagit1(int max, int min) {
//rastgele.next(negatif olamaz) onun icin 1 donderiyoruz
	if(max<=0){
		return 1;
		}
return (rastgele.nextInt(max-min+1)+min);
		}
public Robot1SuperSinif() {
		super();
	} }
//--------------------------------------------------------------
//www.ethemsulan.com
package Robotlar;
public class Robot2 extends Robot2SuperSinif {
public boolean unit2Dagit(){
if(getEnergy2()>0){
	dagilimYap2=getEnergy2()/3;
setAttact2(degerDagit2(dagilimYap2,
	dagilimYap2-4>0 ?dagilimYap2-4:1));
dagilimYap2=getEnergy2()-dagilimYap2;
	dagilimYap2=dagilimYap2/2;
setDefense2(degerDagit2(dagilimYap2, 
	dagilimYap2-4>0 ?dagilimYap2-4:1));
setSpeed2(degerDagit2(dagilimYap2,
	dagilimYap2-4>0 ? dagilimYap2-4:1));
dagilimYap2=getEnergy2()-getAttact2()-getDefense2()-getSpeed2();
int kalaniEkle=rast.nextInt(3);
//random ile dagitimda gucten artan olursa rastgele(3 degerden) birisine ekliyoruz.
if(kalaniEkle==0 && dagilimYap2>0){
	setAttact2(getAttact2()+dagilimYap2);
}else if(kalaniEkle==1&& dagilimYap2>0){
	setDefense2(getDefense2()+dagilimYap2);
}else if(kalaniEkle==2 && dagilimYap2>0){
	setSpeed2(getSpeed2()+dagilimYap2);
	}
	return true;
	}
	return false;
	} }
//---------------------------------------------------------------------
//www.ethemsulan.com
package Robotlar;
import java.util.Random;
public class Robot2SuperSinif {
	private int attact2;
	private int defense2;
	private int speed2 = 10;
	private int location2;
protected static int energy2 = 100;
public static int getEnergy2() {
		return energy2;
	}
public int getLocation2() {
		return location2;
	}
public void setLocation2(int location2) {
		this.location2 = location2;
	}
public int getAttact2() {
		return attact2;
	}
public void setAttact2(int attact2) {
		this.attact2 = attact2;
	}
public int getDefense2() {
		return defense2;
	}
public void setDefense2(int defense2) {
		this.defense2 = defense2;
	}
public int getSpeed2() {
		return speed2;
	}
public void setSpeed2(int speed2) {
		this.speed2 = speed2;
	}
public static int getUnit2() {
		return energy2;
	}
public void setEnergy2(int energy2) {
		Robot2.energy2 -=energy2;
	}
public static void setUnit2(int unit2) {
		Robot2.energy2 -= unit2;
	}
protected Random rast = new Random();
protected int dagilimYap2;
public int degerDagit2(int max, int min) {
//random deger max<=0 oldugunda hata olmamasi icin 1 donderdik
	if(max<=0){
		return 1;
		}
return (rast.nextInt(max-min+1)+min);
	}
public Robot2SuperSinif() {
		super();
	} }

Ana sınıf: http://www.ethemsulan.com/2010/03/cevik-surec-agile-process-ile-javada.html

//www.ethemsulan.com
package TestPaketi;
import Robotlar.Robot1;
import Robotlar.Robot1SuperSinif;
import Robotlar.Robot2;
import Robotlar.Robot2SuperSinif;
import Yonetim.Engine;
import Yonetim.EngineSuperSinif;
import junit.framework.TestCase;
public class TestEngine extends TestCase {
	EngineSuperSinif obje;
	Robot1SuperSinif r1;
	Robot2SuperSinif r2;
protected void setUp() throws Exception {
		super.setUp();
		obje=new Engine();
	r1=new Robot1SuperSinif();
		r2=new Robot2();
	}
//Robot2 icinde default speed2=10 dur
//(23-3)/10*5=90 kalan enerji
public void testRobot2HareketSirasindaHarcadigiEnerji(){
assertNotNull("Harekete gore enerji harca",
		 obje.harEnerHarc2(23, 3));
		}
//Eger hesaplanana deger sifirdan buyuk degilse ates yapilmaz
//yerini degistirir.Yani hareket eder.
public void testRakipteHasarOlusmuyorsaAtesedilmez(){
		assertEquals(0, obje.saldir1());
		}
//Robot1 icindeki speed1=1 default deger verdim.
//(12-2)/2*5=75 olur
public void testRobot1HareketEdinceEnerjiHarcar(){
	assertNotNull("robot2 hareket enerjisi harcar",
		obje.harEnerHarc1(12, 2));
	}
protected void tearDown() throws Exception {
		super.tearDown();
	} }
//---------------------------------------------------
//www.ethemsulan.com
package TestPaketi;
import Robotlar.Robot1;
import junit.framework.TestCase;
public class TestRobot1 extends TestCase {
//Sorun olusturabilecek metodlari test ediyoruz.
	Robot1 nes;
protected void setUp() throws Exception {
		super.setUp();
		nes=new Robot1();
	}
public void testNegatifDegerRandomdaOlamaz(){
assertEquals("Negatif deger 1 donder", 1, 
		nes.degerDagit1(-3, 0));
	}
//degerDagit1(51,40):40 ve 51 dahil olmak ızere rastgele deger uretir
public void testRastgeleSayiUret(){
assertEquals("rastgele deger uret", 50,
		nes.degerDagit1(50, 50));
	}
public void testToplamEnerjiSifirDegil(){
	assertEquals(true, nes.unit1Dagit());
	}
public void testEnerjiBittiRobotOldu(){
		nes.setEnergy1(100);
assertEquals(false, nes.unit1Dagit());
	}
protected void tearDown() throws Exception {
		super.tearDown();
	}
}
//--------------------------------------------------------------
//www.ethemsulan.com
package TestPaketi;
import Robotlar.Robot2;
import junit.framework.TestCase;
public class TestRobot2 extends TestCase {
	Robot2 obj;
protected void setUp() throws Exception {
		super.setUp();
		obj=new Robot2();
	}
public void testTamSayiOlmazsaHataVerir(){
assertEquals(1, obj.degerDagit2(-20, -10));
	}
public void testBelirlenenAraliktaTamsayiUret(){
assertSame(obj.degerDagit2(20, 20), obj.degerDagit2(20, 20));
	}
public void testFarkliAraliktaFarklidegerUret(){
assertNotSame(obj.degerDagit2(40, 30), obj.degerDagit2(15, 8));
	}
public void testParametrelereToplamEnerjiPaylastir(){
assertTrue("Enerji bitmedi ve paylastirma basarili", 
		obj.unit2Dagit());
	}
public void testRobot2SavasiKaybetti(){
		obj.setEnergy2(100);
		assertFalse(obj.unit2Dagit());
	}
protected void tearDown() throws Exception {
		super.tearDown();
	}
}

Ana Sayfa:http://www.ethemsulan.com/2010/03/cevik-surec-agile-process-ile-javada.html

ROBOWAR – A robot battle simulation program

Introduction

You have a one dimensional world of 20 meter long. You have 2 robots armed

with missiles fighting each other. Your mission if you accept it is to write a

program simulating the battle between these two robots until the death of one of the robot.

Robot

A robot is characterized by 5 parameters: attack, shield, speed, location and energy.

· Attack (A): represent the explosive power of the missile.

· Defense (D): represent the strength of the shield

· Speed (S): represents the maximum number of meter the robot can move at once.

· Energy(E): self-explanatory

· Location (L): position of the robot on the axis

Assumptions

· At the beginning of the battle one robot starts at L=0 the other at L=19.

· The battle is round-base: both robots make a move and then the outcome of their move is computed

· A missile always hit its target

· A move is either an attack or a movement within the world

· A robot cannot “jump” over each other and they cannot occupy the same space

· A robot dies when its Energy reaches 0 or less.

· Every robot has finite set amount of energy: 100 units.

· Ten units of ability points can be distributed between attack, defense and speed abilities.

For example: a robot defined by (A=8,D=1,S=1 is strong in attack, but is slow and has weak defense.

· Each move consumes an amount of energy calculated by: (DISTANCE/S)*5

· Each missile hit creates a damage which reduces the energy of a robot

· The damage is calculated by:

DAMAGE(R2) = ( RANDOM(BETWEEN 1 AND 10) * A(R1) / DISTANCE ) – (D(R2) * (DISTANCE / 10))

o Damage cannot be a negative value. Assume 0 if a negative value occurs.
test

//www.ethemsulan.com
package TestPaketi;
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite("Test for TestPaketi");
	//$JUnit-BEGIN$
	suite.addTestSuite(TestRobot2.class);
	suite.addTestSuite(TestRobot1.class);
	suite.addTestSuite(TestEngine.class);
	//$JUnit-END$
	return suite;
	}
}

Robot sınıf orj kod:http://www.ethemsulan.pastebin.com/HiG9cmxA

http://www.ethemsulan.pastebin.com/6z5aP6vz

http://www.ethemsulan.pastebin.com/JFU6tr9R

http://www.ethemsulan.pastebin.com/cUxDfUcR

Engine sınıflar:http://www.ethemsulan.pastebin.com/qeKvD8bJ

http://www.ethemsulan.pastebin.com/yyDhf2ew

Test sınıflar:http://www.ethemsulan.pastebin.com/Xm1wuGK3

http://www.ethemsulan.pastebin.com/dRGJ72BH

http://www.ethemsulan.pastebin.com/fzDdJ43t

http://www.ethemsulan.pastebin.com/hZXhbWHV

TDD ile yazılan robot uygulama kodlarını dropboxdan indirmek için tıklayın(boyut (Boyut 17.6 KB dir)

j1 

Java project oluşturduktan sonra.src üzerine gelip sağ tıklayıp new project ten other(en altta) i seçip resimde görüldüğü gibi java nın içindeki JUNit klasorunden JUnit Test Case yi seçip next diyoruz.

j2

Paket oluşturmadığımız için bir paket ve name yazılan yere de bir isim yazıyoruz.Bu isim genelde(zorunlu değil) hangi sınıf için test yazılıyorsa mesela JUnitSınıf için ben yazıyorum başına Test yazarak isimlendiriyoruz.setUp ve tearDown kutucuklarını işaretleyebilirsiniz.

j3

Fnish deyince uyarı veriyor direk ok tıklayın.

j4 

Dikkat java projemize JUnit 3 ü ekledik.Bujunit.jar test ilgili bir çok metod ve sınıf barındırıyor.

j5

TestJUnitSınıf.java içi yukarda kutuçukları işaretlediğimizden otomatik geldiler.Bu iki metod arasına tüm test lerimizi yazıyoruz.

j6

testOnveBesSayilarinCarpimiEllimi isminde void bir metod tanımladım.Genelde public void isim(){ assert leri yaz} şeklinde yazılır bu metodlar

j7

Dikkat sınıf oluşturmadan testler yazılır.Bunun önemli bir avantajı gereksiz yere (ilerde kullanabilirim bu metodu şimdi oluşturayım da lazım olur gibisinden) metod ve değişken yazılmasını önler ve yazacağımız sınıfı oluşturmadan ne iş yapacağını hayal etmemiz gerekiyor.Ilk önce test yazılır.JUnitSınıfı isminde bir sınıftan nesnem adında obje türetiliyor ve testOnveBesSayilarinCarpimiEllimi() metodunda assertEqual(String mesaj,int yapılacak,int beklenen sonuç) şeklinde testlerimiz yazdık.Işte bunları yazarken aslında carp() isminde ne metodumuz var ne de JUnitSınıfı isminde sınıfımız var.Önce onalra ait testleri yazdık.Işte bu durumda Eclipse idesi bizi uyarır.Bunların olmadığını altı kırmızı işaretleyerek uyarı veriri.Sınıf üzerine gelince bu isimde sınıf olşturulsun mu evet diyoruz otomatik eclipse olşturuyor.Metodta aynı şekilde oluşturuyoruz.Aşağıdaki resimlerde görüldüğü gibi uyarı veriri.

j8

j9

create class tıklayıp finis ile sınıfı otomatik bizim için oluşturu eclipse.

j10

Sınıf oluşturulduktan sonra bu sefer carp() isminde metod yok uyarısını veriri.Onu da otomatik oluşturuyoruz

j11

Buraya dikkat otomatik oluşturulan metodların genelde tipi Object olur ve dönen değer varsa null olur.Bunları biz istediğimiz şekilde değiştirebiliyoruz.Bize i*j sonucu ve int tipinde metod lazım.

j12

Bunu da oluşturduktan sonra TestJUnitSinifi sınıfımıza gidip sağ tıklayıp Run as JUnit test ile testimizi çalıştırıyoruz.

j13

Dikkat biz 5 ve 10 parametrelerini gönderdik ve sonucun 50 olmasını gerekir.beklenen değere 100 yazıldığı için şartımız sağlanamdığından testimiz yanlış olur ve geçmez.Hatayı da sağ alt köşede belirtiyor.

j14

Yukarda görüldüğü gibi testimizin beklenen kısmına 50 yazınca yeşil yanıyor ve testimiz geçti.Test geçtiği anda yeni bir teste geçilir.

1.Planlama Oyunu–>Tam olarak ne yapilacaginin planini yaparak ise baslanir. Çok detayli bir plana gerek yok.Bu safhada müsteriyle olusturulan kullanici hikayelerine öncelik verilir. Yani bir sonraki iterasyonda yapilmasi gereken isler görüsülür.Sürüm ve iterasyon içerigi tespit edilir ve planlar olusturulur.Palanlama oyununa müsteri, kullanicilar ve programcilar katilir.

2.Ufak Sürümler–>Her sürüm anlam teskil edebilecek mümkün oldugu kadar çalisabilir ufak programdan olusmali. Bu çalisabilir program müsteri ve kullanicilara verilir. Eksik ya da gereksinimleri tam karsilamiyorsa gereksinimler degisiklige ugrayabilir. Bir sonraki iterasyonda bu degisiklik göz önünde bulundurulur. Kisaca eksikleri tespit edip bir sonraki sürümde daha iyi bir ürün elde edilir

3.Metafor–>Programin nasil bir islevi olacagini ekibin gözünde canlandirmak için kullanilan kavramlardir. Ne yapilmasi gerektigi hakkinda fikir sahibi olmak için kullanilir(örnegin alis- veris sepeti, resim birer metafor kavramlari olabilir)

4.Basit Tasarim–>Sade tasarimla sistemin komplex bir hal almasinin önüne geçilir. Basit tasarimin implementasyonu ve gelistirmesi kolay olur.

5.Test Etme–>Sorun yaratabilecek metodlar için test yazilmali. Yapilcak degisikler önceden yazilan testleri kirmamalidir.

6.Yeniden Yapilandirma(Refactoring)–> Tasarim hatalari giderilmeli ve yapilan degisiklikler sisteme entegre edilmelidir. Unit testler yardimiyla yapilan degisikler öncekiyle birlestirilmeli. Bu sekilde hem tasarimin kötüye gitmedi engellenir hem de degisime cevap verilir. Kodlari daha esnek ve anlamli olacak sekilde degistirilebilmeyi saglar.

7.Ikili Programlama–>Iki programci ayni bilgisayarda çalisir. Dönüsümlü olarak biri kod yazarken digeri bakar.

8.Kollektif Sahiplik–> Belli kod bölümlerinden belli programcilar sorumlu degil. Herhangi bir programci gerektigi durumlarda herhangi bir kod parçasini degistirebilir.

9.Sürekli Entegrasyon–>Yeni bilesenler ve degisikler sisteme entegre edilerek test edilir. Böylece yapilan degisiklerden diger programcilar haberdar olur ve olusabilecek hatalar erkenden tespit edilir.

10.Haftada 40 Saat–>Programcinin verimli olabilmesi için belirli zaman araliklarinda çalismali.Programcilari çok fazla çalistirarak yipratilmamalidir.

11.Müsterinin Yaninda Olmak–>Gereksinimleri belirleyen müsteridir. Müsteri istekleri dogrultusunda yazilim gelistirilir. Müsteri ve programcilar sürekli iletisim halinde olmalari gerekir. Bu süreki iletisim projenin tam müsterinin istedigi gibi bir ürün elde edilmesini saglar.

12.Kodlama Standartlari–>Her kes tarafindan anlasilmasi için belli bir kod standartlari uygulanir. Örnegin degisken ve metodlarin isimlendirilmesi.

13.Ayakta Toplanti–>Proje çalisanlari projenin gidisati hakkinda her gün 15 dakikayi asmayacak sekilde bir araya gelerek fikir alis-verisinde bulunurlar. Bu toplanatilar ayakta yapilir

14.Geriye Bakis–>Meydana gelen sorunlari gözden geçirilerek tekrarlanmasini önelemek amaciyla yapilan toplantialrdir.

Not: Bu pratikler birlikte uygulanırsa anlamlı olur.

n1

Netbeans’e MySql JDBC Driverini kurmak için resimde görüldüğü gibi Libraries yeri sağ tıklayıp add library tıklayın.

n2

n3

Burada bir çok kütüphane var.Hangisini isterseniz uygulkamanıza ekleyebilirsiniz.

n4

Birini seçince add library buttonu aktif olur.Buttona tıklayınca sizin uygulamanıza eklenir driver.

ngenel

Aynı şekilde PostgresSql JDBC(Java Database Connectivity) Driverini postgresql e java ile bağlanmak için ekleyebilirsiniz.ya da JUnit i ekleyebilirsiniz.Junit yazdığınız kodları test etmek için kullanılan frameworktur.Kısaca burada istediğinizi seçip add library buttonuna tıklayarak uygulamanıza dahil edebilirsiniz.

JUnit Eclipse
JUnit ile örnek uyglama

Yazilim geliştirme süreci analiz,tasarım, kodlama, test, sürüm ve bakım dan oluşur.Proje çalışanları çoğu zaman içgüdüsel korku hissedebilirler. Bunun en büyük sebebi belirsizliktir. Çevik süreç bu belirsizliklerden uzak tutuyor. Yani yazılımcıları düşünüyor. Şelale yöntemini kullanan yazılımcıda mutlaka projenin nereye gidileceğini kafasında hep kurçalar. Bu da programcıya sağlık açısınndan zarar veriyor. Bu iterasyon yöntem de ise testimiz başarılı olduğu anda iş bitti gerisi bir sonraki teste yazılana kadar bizi bağlamaz.

Extreme Programming(XP)

Xp Değerleri–>Basitlik , Geridönüş, Iletişim, Cesaret

Xp Prensipleri

1-Rapid feedback(Hızlı geridönüş) 2-Assume simplicity(Basitliği tercih etmek) 3-Incremental change(Inkrementel değişikler) 4-Embracing change(Değişimi istemek) 5-Quality work(Kaliteli iş)

6-Teach learning(Öğrenmeyi öğret) 7-Small initial investment(Az başlangıç yatırımı) 8-Play to win(Kazanmak için oyna) 9-Concrete Experiments(Somut denemeler) 10-Open, honest communication(Açık ve samimi iletişim) 11-Work with people’s instincs, not against them(Takımın iç güdülerini kullan, onlara karşı koyma) 12-Accepted responsibility(Sorumluluk üstlenmek) 13-Local adaption(Sürecin ortam şartlarına adapte edilmesi) 14-Travel light(Az yükle yolculuk yapmak) 15-Honest measurement(Doğru ölçüm)Xp

Tenknikleri

1-On-site customer(Programcıya yakın müşteri) 2-Standup-meeting(Ayakta toplantı) 3-Planing game(Planlama oyunu) 4-Short releases(Kısa aralıklarla yeni sürüm) 5-Retrospective(Geriye bakış) 6-Metaphor(Metafor yani ne yapılacağını ekibin gözünde canlandırmak) 7-Collective ownership(Ortak sorumluluk) 8-Continuous integration(Sürekli entegrasyon) 9-Coding standart(Kod standartları) 10-Sustainable pace(Kalıcı tempo) 11-Testing(Test etmek) 12-Simple design(Sade tasarım) 13-Refactoring(Yeniden yapılandırma) 14-Pair programming(Eşli programlama)

Bu teknikler hepsi birlikte uygulanamlıdır fakat en önemlisi refactoring ve simple design birbirini tamamlamasıdır bence.

Xp Rolleri

1-Müşteri 2-Programcı 3-Proje Menajeri(Müşteri ve programcıyı bir araya getirir ve takımın karşılaştığı sorunlarda yardımcı olur) 4-Koç(Çevik süreci tanıyan ve nasıl uygulanması gerektiğini bilen uzmandır) 5-Testçi(Müşteri atarfından oluşturulan akseptans testlerini implemente eder ve Junit ile entegrasyon testlerinde diğerlerine yardımcı olur.)