SlideShare a Scribd company logo
1 of 41
Download to read offline
JUNIT
Beyond the basics
/AdamDudczak @maneo
Atmosphere2014,Warszawa,19-20.05.2014
WHO AM I?
Software Engineer in Allegro group
Workingwith Java(and JUnit) since 2004
One of the leaders of
Co-organizer of conference
Poznań JUG
GeeCON
WHY JUNIT?
source:wikipedia
THERE IS NO SPOCK...
source:http://bit.ly/R0r8Ox
WHY NOT?
source:http://bit.ly/1jNoT8f
ERRORRATE CLASS
publicclassErrorRate{
doubleerrorRate;
publicErrorRate(longnoOfItems,longnoOfErrors){
errorRate=calculateErrorRate(noOfItems,noOfErrors);
}
doublecalculateErrorRate(longnoOfItems,longnoOfErrors){
...
}
publicStringgetErrorRateAsString(){
returnString.format("%2.02f",errorRate);
}
}
SIMPLE ERRORRATE TEST
publicclassErrorRateTest{
@Test
publicvoidshouldCalculateErrorRate(){
//given
ErrorRateerrorRate=newErrorRate(100,10);
//when
Stringresult=errorRate.getErrorRateAsString();
//then
assertThat(result,is("0.01"));
}
}
SIMPLE ERRORRATE TEST
Object[][]testParameters=newObject[][]{
newObject[]{100,1,"0.01"},
newObject[]{0,0,"0.00"},
};
@Test
publicvoidshouldCalculateErrorRate1(){
for(inti=0;i>testParameters.length;i++){
ErrorRateerrorRate
=newErrorRate((Integer)testParameters[i][0],
(Integer)testParameters[i][1]);
Stringresult=errorRate.getErrorRateAsString();
assertThat(result,is((String)testParameters[i][2]));
}
}
LET'S BRAKE SOMETHING...
Object[][]testParameters=newObject[][]{
newObject[]{ 100,1,"0.02"},
newObject []{0,0,"0.02"},
};
Firsterror stops test
Allcases are seen as one test
JUNIT PARAMETRIZED
@RunWith(Parameterized.class)
publicclassErrorRateTest{
@Parameters
publicstaticCollection<Object[]>data(){
returnArrays.asList(newObject[][]{
newObject[]{100,1,"0.01"},
newObject[]{0,0,"0.00"},});
}
...
JUNIT PARAMETRIZED (2)
...
longtotalNumberOfItems;
longtotalNumberOfRejected;
doublefinalErrorRate;
publicErrorRateTest(longtotalNumberOfItems,
longtotalNumberOfRejected,
doublefinalErrorRate){
this.totalNumberOfItems=totalNumberOfItems;
this.totalNumberOfRejected=totalNumberOfRejected;
this.finalErrorRate=finalErrorRate;
}
...
JUNIT PARAMETRIZED (3)
...
@Test
publicvoidshouldCalculateErrorRate(){
//given
ErrorRateerrorRate=newErrorRate(totalNumberOfItems,
totalNumberOfRejected);
//when
Stringresult=errorRate.getErrorRateAsString();
//then
assertThat(result,is(finalErrorRate));
}
...
LET'S BRAKE SOMETHING...
Two independenttests
Alotof boilerplate code!
Onlyone occurance of @Parameters per class
JUNIT-PARAMS
Parameterised tests thatdon'tsuck
Created byPaweł Lipiński
Alotof veryinterestingideas.
https://code.google.com/p/junitparams/
<dependency>
<groupId>pl.pragmatists</groupId>
<artifactId>JUnitParams</artifactId>
<version>1.0.2</version>
<scope>test</scope>
</dependency>
JUNIT-PARAMS - SHOWCASE
@RunWith(JUnitParamsRunner.class)
publicclassSamples_of_Usage_Test{
@Test
@Parameters({"AAA,1","BBB,2"})
publicvoidparams_in_annotation(Stringp1,Integerp2){}
@Test
@Parameters
publicvoidparams_in_default_method(Stringp1,Integerp2){}
privateObjectparametersForParams_in_default_method()
{
return$($("AAA",1),$("BBB",2));
}
JUNIT-PARAMS - SHOWCASE
@Test
@Parameters(method="named2,named3")
publicvoidparams_in_multiple_methods(Stringp1,Integerp2){}
privateObjectnamed2(){return$($("AAA",1));}
privateObjectnamed3(){return$($("BBB",2));}
@Test
@Parameters(source
=ParametersProvidersTest.OneIntegerProvider.class)
publicvoidparameters_from_external_class(intinteger){}
JUNIT-PARAMS - SHOWCASE
@Test
@FileParameters("src/test/resources/test.csv")
publicvoidload_params_from_csv(intage,Stringname){}
@Test
@FileParameters(value="src/test/resources/test.csv",
mapper=PersonMapper.class)
publicvoidload_params_from_any_file(PersonTest.Personperson){}
@Test
@FileParameters("classpath:test.csv")
publicvoidload_params_from_classpath(intage,Stringname){}
JUNIT-PARAMS
More examples can be found at iSamples_of_Usage_Test.java
PersonTest.java
Similar to approach in TestNG
Testcode is clear and concise -YEAH!!
ORG.JUNIT.EXPERIMENTAL.THEORIES
Theoryis, in factaparameterized test
This approach is more focused on requirements than on
particular testcases
Similar to ScalaCheck (Scala) /QuickCheck (Erlang)
ORG.JUNIT.EXPERIMENTAL.THEORIES
Theorydescribes features of class/method and verifies them
usinggiven setof inputdata
Theoryis executed as one test
If assertion fails for anysetof inputdatawhole theoryfails
Example in ErrorRate_05_Theory_Test.java
RANDOMIZED UNIT TESTING
"Monkeytesting"-more randomness in your tests
http://labs.carrotsearch.com/randomizedtesting.html
RANDOMIZED UNIT TESTING
@Test
publicvoidrandomizedTesting(){
//Herewepicktwopositiveintegers.
//Notesuperclassutilitymethods.
inta=randomIntBetween(0,Integer.MAX_VALUE);
intb=randomIntBetween(0,Integer.MAX_VALUE);
intresult=Adder.add(a,b);
assertTrue(result+"<("+a+"or"+b+")?",
result>=a&&result>=b);
}
SOMETHING WENT WRONG!
@Seed("2300CE9BBBCFF4C8:573D00C2ABB4AD89")
@THREADLEAKING*
Randomized UnitTestinglibraryhelps to check/control
threads activity
@ThreadLeaking*annotations verfies if threads are leaking
from your tests/suite
Check outErrorRate_06_Randomized_Test.java
@RULE
source:http://bit.ly/1jNpE13
@RULE
Resuable @Before/@After... and more
Example in JunitRulesShowcaseTest
JUnithas severalbuilt-in @Rules, ex.:
ExternalResource, ExpectedException, TestName...
@RULE
publicstaticclassHasTempFolder{
@Rule
publicTemporaryFolderfolder=newTemporaryFolder();
@Test
publicvoidtestUsingTempFolder()throwsIOException{
FilecreatedFile=folder.newFile("myfile.txt");
FilecreatedFolder=folder.newFolder("subfolder");
//...
}
}
@Rule cannotbe applied to static fields -use @ClassRule
@RULE IN BETAMAX
importco.freeside.betamax.Betamax;
importco.freeside.betamax.Recorder;
importorg.junit.*;
publicclassMyTest{
@RulepublicRecorderrecorder=newRecorder();
@Betamax(tape="mytape")
@Test
publicvoidtestMethodThatAccessesExternalWebService(){
}
}
@RULE WITH SPRING AND WIREMOCK
@Rule
publicWireMockRulewireMockRule=newWireMockRule(8089);
//Checkouthttp://wiremock.org/
@Rule
publicTestRulecontextRule=newSpringContextRule(
newString[]{"testContext.xml"},this);
@Autowired
publicStringbar;
@Test
publicvoidtestBar()throwsException{
....
}
JUNIT BENCHMARKS AND TIMEOUT
publicclassMyTest{
@Rule
publicTestRulebenchmarkRun=newBenchmarkRule();
@Rule
publicTestTimeouttimeoutRule=newTestTimeout(30);
@Test
publicvoidtwentyMillis()throwsException{
Thread.sleep(20);
}
}
MyTest.twentyMillis:[measured10outof15rounds]
round:0.02[+-0.00],round.gc:0.00[+-0.00],GC.calls:0,
GC.time:0.00,time.total:0.32,
time.warmup:0.12,time.bench:0.20
JUNIT BENCHMARKS
Chartand persistentresults history
http://labs.carrotsearch.com/junit-benchmarks.html
BETTER EXCEPTION HANDLING
Example byRafał Borowiec ( )blog.codeleak.pl/
publicclassExpectedExceptionsTest{
@Rule
publicExpectedExceptionthrown=ExpectedException.none();
@Test
publicvoidverifiesTypeAndMessage(){
thrown.expect(RuntimeException.class);
thrown.expectMessage("Runtimeexceptionoccurred");
thrownewRuntimeException("Runtimeexceptionoccurred");
}
}
"NEW" ASSERTIONS
source:http://bit.ly/1taOW0H
"NEW" ASSERTIONS
assertThatand built-in Hamcrestmatchers
Readable assertions and better error handling
assertThat("thisstring",is("thisstring"));
assertThat(theBiscuit,is(equalTo(myBiscuit)));
assertThat("thisstring",containsString("is"));
ALTERNATIVE APPROACH - FEST/ASSERTJ
Alternative (butin factamainstream) wayof building
assertions
gives access to hundreds of assertionsAssertJ
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron)
.isIn(fellowshipOfTheRing);
assertThat(sauron).isNotIn(fellowshipOfTheRing);
ORGANIZE TESTS IN @SUITE
@RunWith(Suite.class)
@SuiteClasses({
ErrorRate_01_SimpleTest.class,
ErrorRate_03_Parametrized_Test.class
})
publicclassSuiteInitializationExample{
@ClassRule
publicstaticExternalResourceresource=newExternalResource(){
@Override
protectedvoidbefore()throwsThrowable{
System.out.println("StartingtheheavyweightServer");
};
@Override
protectedvoidafter(){
System.out.println("StoppingtheheavyweightServer");
};
};
}
CATEGORIES/SUITES AND BUILD TOOLS
Suite is abitAnt-ish -use Categories
Categories are supported byboth andMaven Gradle
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<groups>com.ex.FastTests,com.ex.RegressionTests</groups>
</configuration>
</plugin>
</plugins>
</build>
USE CATEGORIES ON THE @SUITE LEVEL
publicclassHeavyIntegrationTest{
@Test
@Category(HeavyWeight.class)
publicvoidshouldCalculateErrorRate(){
assumeTrue(isHeavyWeightServerRunning());
//heavestuffwithheavyWeightserverhere
}
...
USE CATEGORIES ON THE @SUITE LEVEL
@RunWith(Categories.class)
@IncludeCategory(HeavyWeight.class)
@SuiteClasses({
ErrorRate_01_SimpleTest.class,
HeavyIntegrationTest.class
})
publicclassSuiteWithCategories{
//categorymarkerinterface
publicinterfaceHeavyWeight{}
...
CODE SAMPLES
Allexamples can be found at:
https://bitbucket.org/maneo/junit-presentation/
THAT'S ALL FOLKS
Thank you for your attention.
adam (at) dudczak.info /@maneo

More Related Content

Viewers also liked

CONFidence 2014: Dimitriy Chastuhin: All your sap p@$$w0яd z belong to us
CONFidence 2014: Dimitriy Chastuhin:  All your sap p@$$w0яd z belong to usCONFidence 2014: Dimitriy Chastuhin:  All your sap p@$$w0яd z belong to us
CONFidence 2014: Dimitriy Chastuhin: All your sap p@$$w0яd z belong to us
PROIDEA
 

Viewers also liked (16)

JDD2015: Towards the Fastest (J)VM on the Planet! - Jaroslav Tulach
JDD2015: Towards the Fastest (J)VM on the Planet! - Jaroslav TulachJDD2015: Towards the Fastest (J)VM on the Planet! - Jaroslav Tulach
JDD2015: Towards the Fastest (J)VM on the Planet! - Jaroslav Tulach
 
JDD2015: Migrating to continuous delivery in the world of financial trading -...
JDD2015: Migrating to continuous delivery in the world of financial trading -...JDD2015: Migrating to continuous delivery in the world of financial trading -...
JDD2015: Migrating to continuous delivery in the world of financial trading -...
 
CONFidence 2014: Dimitriy Chastuhin: All your sap p@$$w0яd z belong to us
CONFidence 2014: Dimitriy Chastuhin:  All your sap p@$$w0яd z belong to usCONFidence 2014: Dimitriy Chastuhin:  All your sap p@$$w0яd z belong to us
CONFidence 2014: Dimitriy Chastuhin: All your sap p@$$w0яd z belong to us
 
CONFidence 2014: Alexander Timorin: SCADA deep inside: protocols and security...
CONFidence 2014: Alexander Timorin: SCADA deep inside: protocols and security...CONFidence 2014: Alexander Timorin: SCADA deep inside: protocols and security...
CONFidence 2014: Alexander Timorin: SCADA deep inside: protocols and security...
 
Atmosphere 2014: Helping the Internet to scale since 1998 - Paweł Kuśmierski
Atmosphere 2014: Helping the Internet to scale since 1998 - Paweł KuśmierskiAtmosphere 2014: Helping the Internet to scale since 1998 - Paweł Kuśmierski
Atmosphere 2014: Helping the Internet to scale since 1998 - Paweł Kuśmierski
 
Atmosphere 2014: Scaling and securing node.js apps - Maciej Lasyk
Atmosphere 2014: Scaling and securing node.js apps - Maciej LasykAtmosphere 2014: Scaling and securing node.js apps - Maciej Lasyk
Atmosphere 2014: Scaling and securing node.js apps - Maciej Lasyk
 
JDD2015: Trudne Rozmowy [WORKSHOP] - Mariusz Sieraczkiewicz
JDD2015: Trudne Rozmowy [WORKSHOP] - Mariusz SieraczkiewiczJDD2015: Trudne Rozmowy [WORKSHOP] - Mariusz Sieraczkiewicz
JDD2015: Trudne Rozmowy [WORKSHOP] - Mariusz Sieraczkiewicz
 
JDD2015: Ratpack: core of your micro-services - Andrey Adamovich
JDD2015: Ratpack: core of your micro-services - Andrey AdamovichJDD2015: Ratpack: core of your micro-services - Andrey Adamovich
JDD2015: Ratpack: core of your micro-services - Andrey Adamovich
 
Atmosphere 2014: RE:SPONSIBILITY - Matt Harasymczuk
Atmosphere 2014: RE:SPONSIBILITY - Matt HarasymczukAtmosphere 2014: RE:SPONSIBILITY - Matt Harasymczuk
Atmosphere 2014: RE:SPONSIBILITY - Matt Harasymczuk
 
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
 
PLNOG15 :Contagious SDN - consequences of dealing with it, Paweł Korzec
PLNOG15 :Contagious SDN - consequences of dealing with it, Paweł KorzecPLNOG15 :Contagious SDN - consequences of dealing with it, Paweł Korzec
PLNOG15 :Contagious SDN - consequences of dealing with it, Paweł Korzec
 
JDD2014/ 4Developers 2015: Błędy uwierzytelniania i zarządzania sesją w JEE -...
JDD2014/ 4Developers 2015: Błędy uwierzytelniania i zarządzania sesją w JEE -...JDD2014/ 4Developers 2015: Błędy uwierzytelniania i zarządzania sesją w JEE -...
JDD2014/ 4Developers 2015: Błędy uwierzytelniania i zarządzania sesją w JEE -...
 
4Developers 2015: Minimalizowanie szkód powodowanych przez nowego członka w z...
4Developers 2015: Minimalizowanie szkód powodowanych przez nowego członka w z...4Developers 2015: Minimalizowanie szkód powodowanych przez nowego członka w z...
4Developers 2015: Minimalizowanie szkód powodowanych przez nowego członka w z...
 
JDD2014: Introducing groovy into JAVA project - Yuriy Chulovskyy
JDD2014: Introducing groovy into JAVA project - Yuriy ChulovskyyJDD2014: Introducing groovy into JAVA project - Yuriy Chulovskyy
JDD2014: Introducing groovy into JAVA project - Yuriy Chulovskyy
 
JDD2014: Effective refactoring - Włodek Krakowski
JDD2014:  Effective refactoring - Włodek KrakowskiJDD2014:  Effective refactoring - Włodek Krakowski
JDD2014: Effective refactoring - Włodek Krakowski
 
JDD 2015: Artificial intelligence. Status report. - Tomasz Jackowiak
JDD 2015: Artificial intelligence. Status report. - Tomasz Jackowiak JDD 2015: Artificial intelligence. Status report. - Tomasz Jackowiak
JDD 2015: Artificial intelligence. Status report. - Tomasz Jackowiak
 

Similar to Atmosphere 2014: JUnit: beyond the basics - Adam Dudczak

jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docxjhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
priestmanmable
 
Avoid loss of hair while coding Unity3D plugin for mobile
Avoid loss of hair while coding Unity3D plugin for mobileAvoid loss of hair while coding Unity3D plugin for mobile
Avoid loss of hair while coding Unity3D plugin for mobile
Valerio Riva
 
Java_Exception-CheatSheet_Edureka.pdf
Java_Exception-CheatSheet_Edureka.pdfJava_Exception-CheatSheet_Edureka.pdf
Java_Exception-CheatSheet_Edureka.pdf
Furkan Furkan
 

Similar to Atmosphere 2014: JUnit: beyond the basics - Adam Dudczak (20)

Communication between Java and Python
Communication between Java and PythonCommunication between Java and Python
Communication between Java and Python
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
 
Pimp My Java LavaJUG
Pimp My Java LavaJUGPimp My Java LavaJUG
Pimp My Java LavaJUG
 
Paradigmas de linguagens de programacao - aula#9
Paradigmas de linguagens de programacao - aula#9Paradigmas de linguagens de programacao - aula#9
Paradigmas de linguagens de programacao - aula#9
 
E:\Plp 2009 2\Plp 9
E:\Plp 2009 2\Plp 9E:\Plp 2009 2\Plp 9
E:\Plp 2009 2\Plp 9
 
Flutter Forward EXTENDED - Flutter로 앱 개발 입문하기
Flutter Forward EXTENDED -  Flutter로 앱 개발 입문하기Flutter Forward EXTENDED -  Flutter로 앱 개발 입문하기
Flutter Forward EXTENDED - Flutter로 앱 개발 입문하기
 
Job Managment Portlet
Job Managment PortletJob Managment Portlet
Job Managment Portlet
 
Developing R Graphical User Interfaces
Developing R Graphical User InterfacesDeveloping R Graphical User Interfaces
Developing R Graphical User Interfaces
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
JDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
JDD 2016 - Sebastian Malaca - You Dont Need Unit TestsJDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
JDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
 
Core java
Core javaCore java
Core java
 
Java API, Exceptions and IO
Java API, Exceptions and IOJava API, Exceptions and IO
Java API, Exceptions and IO
 
jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docxjhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
jhpcerrorErrorLog.javajhpcerrorErrorLog.javaCopyright (c.docx
 
Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015
 
Annotation Processing in Android
Annotation Processing in AndroidAnnotation Processing in Android
Annotation Processing in Android
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
 
Avoid loss of hair while coding Unity3D plugin for mobile
Avoid loss of hair while coding Unity3D plugin for mobileAvoid loss of hair while coding Unity3D plugin for mobile
Avoid loss of hair while coding Unity3D plugin for mobile
 
Avoid loss of hair while coding Unity3D plugins for mobile
Avoid loss of hair while coding Unity3D plugins for mobileAvoid loss of hair while coding Unity3D plugins for mobile
Avoid loss of hair while coding Unity3D plugins for mobile
 
The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]The 2016 Android Developer Toolbox [MOBILIZATION]
The 2016 Android Developer Toolbox [MOBILIZATION]
 
Java_Exception-CheatSheet_Edureka.pdf
Java_Exception-CheatSheet_Edureka.pdfJava_Exception-CheatSheet_Edureka.pdf
Java_Exception-CheatSheet_Edureka.pdf
 

Recently uploaded

Uncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac FolorunsoUncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac Folorunso
Kayode Fayemi
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
Kayode Fayemi
 
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
David Celestin
 
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
amilabibi1
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
raffaeleoman
 

Recently uploaded (15)

Uncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac FolorunsoUncommon Grace The Autobiography of Isaac Folorunso
Uncommon Grace The Autobiography of Isaac Folorunso
 
ICT role in 21st century education and it's challenges.pdf
ICT role in 21st century education and it's challenges.pdfICT role in 21st century education and it's challenges.pdf
ICT role in 21st century education and it's challenges.pdf
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
 
lONG QUESTION ANSWER PAKISTAN STUDIES10.
lONG QUESTION ANSWER PAKISTAN STUDIES10.lONG QUESTION ANSWER PAKISTAN STUDIES10.
lONG QUESTION ANSWER PAKISTAN STUDIES10.
 
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
Proofreading- Basics to Artificial Intelligence Integration - Presentation:Sl...
 
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
Bring back lost lover in USA, Canada ,Uk ,Australia ,London Lost Love Spell C...
 
Report Writing Webinar Training
Report Writing Webinar TrainingReport Writing Webinar Training
Report Writing Webinar Training
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
 
Dreaming Marissa Sánchez Music Video Treatment
Dreaming Marissa Sánchez Music Video TreatmentDreaming Marissa Sánchez Music Video Treatment
Dreaming Marissa Sánchez Music Video Treatment
 
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdfThe workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
 
My Presentation "In Your Hands" by Halle Bailey
My Presentation "In Your Hands" by Halle BaileyMy Presentation "In Your Hands" by Halle Bailey
My Presentation "In Your Hands" by Halle Bailey
 
SOLID WASTE MANAGEMENT SYSTEM OF FENI PAURASHAVA, BANGLADESH.pdf
SOLID WASTE MANAGEMENT SYSTEM OF FENI PAURASHAVA, BANGLADESH.pdfSOLID WASTE MANAGEMENT SYSTEM OF FENI PAURASHAVA, BANGLADESH.pdf
SOLID WASTE MANAGEMENT SYSTEM OF FENI PAURASHAVA, BANGLADESH.pdf
 
Dreaming Music Video Treatment _ Project & Portfolio III
Dreaming Music Video Treatment _ Project & Portfolio IIIDreaming Music Video Treatment _ Project & Portfolio III
Dreaming Music Video Treatment _ Project & Portfolio III
 
Digital collaboration with Microsoft 365 as extension of Drupal
Digital collaboration with Microsoft 365 as extension of DrupalDigital collaboration with Microsoft 365 as extension of Drupal
Digital collaboration with Microsoft 365 as extension of Drupal
 
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdfAWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
AWS Data Engineer Associate (DEA-C01) Exam Dumps 2024.pdf
 

Atmosphere 2014: JUnit: beyond the basics - Adam Dudczak