Suche senden
Hochladen
Testing: Python, Java, Groovy, etc.
•
1 gefällt mir
•
1,404 views
Russel Winder
Folgen
Guest lecture on Laurie Tratt's course on testing at KCL, 2012-12-06.
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 41
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
ACCU 2012: Go, D, C++ and The Multicore Revolution
ACCU 2012: Go, D, C++ and The Multicore Revolution
Russel Winder
Just Keep Sending The Messages
Just Keep Sending The Messages
Russel Winder
Python+gradle
Python+gradle
Stephen Holsapple
Testing Storm components with Groovy and Spock
Testing Storm components with Groovy and Spock
Eugene Dvorkin
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
BTI360
Acceptance Test Driven Development
Acceptance Test Driven Development
John Ferguson Smart Limited
Case Study- Automation Test Framework (ATF) Development & Infotainment Valida...
Case Study- Automation Test Framework (ATF) Development & Infotainment Valida...
KPIT
Why Groovy When Java 8 or Scala, or…
Why Groovy When Java 8 or Scala, or…
Russel Winder
Empfohlen
ACCU 2012: Go, D, C++ and The Multicore Revolution
ACCU 2012: Go, D, C++ and The Multicore Revolution
Russel Winder
Just Keep Sending The Messages
Just Keep Sending The Messages
Russel Winder
Python+gradle
Python+gradle
Stephen Holsapple
Testing Storm components with Groovy and Spock
Testing Storm components with Groovy and Spock
Eugene Dvorkin
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
BTI360
Acceptance Test Driven Development
Acceptance Test Driven Development
John Ferguson Smart Limited
Case Study- Automation Test Framework (ATF) Development & Infotainment Valida...
Case Study- Automation Test Framework (ATF) Development & Infotainment Valida...
KPIT
Why Groovy When Java 8 or Scala, or…
Why Groovy When Java 8 or Scala, or…
Russel Winder
Gant, the lightweight and Groovy targeted scripting framework
Gant, the lightweight and Groovy targeted scripting framework
Skills Matter
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Russel Winder
Just Keep Sending The Messages
Just Keep Sending The Messages
Russel Winder
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
JAX London
Just Keep Passing The Messages
Just Keep Passing The Messages
Russel Winder
It's all about processes communicating - Russel Winder
It's all about processes communicating - Russel Winder
JAX London
It's All About Processes Communicating
It's All About Processes Communicating
Russel Winder
Design for Testability
Design for Testability
Pawel Kalbrun
Functional testing patterns
Functional testing patterns
Premanand Chandrasekaran
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Puppet
Building infrastructure for Big Data
Building infrastructure for Big Data
PromptCloud
Closures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel Winder
JAX London
Closures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In Java
Russel Winder
Introduction_to_Scrum_Agile_Values
Introduction_to_Scrum_Agile_Values
Laszlo Szalvay
GPars Workshop
GPars Workshop
Russel Winder
Big datalittletests heintz
Big datalittletests heintz
drewz lin
Testing on Android
Testing on Android
Diego Torres Milano
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Gustavo Fuentes Zurita
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Gustavo Fuentes Zurita
Test Driven Development presentation delhi meetup
Test Driven Development presentation delhi meetup
Naveen Kumar Singh
On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
Russel Winder
The Case for Kotlin and Ceylon
The Case for Kotlin and Ceylon
Russel Winder
Weitere ähnliche Inhalte
Ähnlich wie Testing: Python, Java, Groovy, etc.
Gant, the lightweight and Groovy targeted scripting framework
Gant, the lightweight and Groovy targeted scripting framework
Skills Matter
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Russel Winder
Just Keep Sending The Messages
Just Keep Sending The Messages
Russel Winder
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
JAX London
Just Keep Passing The Messages
Just Keep Passing The Messages
Russel Winder
It's all about processes communicating - Russel Winder
It's all about processes communicating - Russel Winder
JAX London
It's All About Processes Communicating
It's All About Processes Communicating
Russel Winder
Design for Testability
Design for Testability
Pawel Kalbrun
Functional testing patterns
Functional testing patterns
Premanand Chandrasekaran
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Puppet
Building infrastructure for Big Data
Building infrastructure for Big Data
PromptCloud
Closures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel Winder
JAX London
Closures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In Java
Russel Winder
Introduction_to_Scrum_Agile_Values
Introduction_to_Scrum_Agile_Values
Laszlo Szalvay
GPars Workshop
GPars Workshop
Russel Winder
Big datalittletests heintz
Big datalittletests heintz
drewz lin
Testing on Android
Testing on Android
Diego Torres Milano
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Gustavo Fuentes Zurita
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Gustavo Fuentes Zurita
Test Driven Development presentation delhi meetup
Test Driven Development presentation delhi meetup
Naveen Kumar Singh
Ähnlich wie Testing: Python, Java, Groovy, etc.
(20)
Gant, the lightweight and Groovy targeted scripting framework
Gant, the lightweight and Groovy targeted scripting framework
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Just Keep Passing the Messages from Groovy and Grails eXchange 2011
Just Keep Sending The Messages
Just Keep Sending The Messages
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
Java Tech & Tools | Just Keep Passing the Message | Russel Winder
Just Keep Passing The Messages
Just Keep Passing The Messages
It's all about processes communicating - Russel Winder
It's all about processes communicating - Russel Winder
It's All About Processes Communicating
It's All About Processes Communicating
Design for Testability
Design for Testability
Functional testing patterns
Functional testing patterns
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Continuous Development with Jenkins - Stephen Connolly at PuppetCamp Dublin '12
Building infrastructure for Big Data
Building infrastructure for Big Data
Closures, the next "Big Thing" in Java: Russel Winder
Closures, the next "Big Thing" in Java: Russel Winder
Closures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In Java
Introduction_to_Scrum_Agile_Values
Introduction_to_Scrum_Agile_Values
GPars Workshop
GPars Workshop
Big datalittletests heintz
Big datalittletests heintz
Testing on Android
Testing on Android
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Testingonandroid v2-091203161835-phpapp02
Test Driven Development presentation delhi meetup
Test Driven Development presentation delhi meetup
Mehr von Russel Winder
On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
Russel Winder
The Case for Kotlin and Ceylon
The Case for Kotlin and Ceylon
Russel Winder
On the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layer
Russel Winder
Fast Python? Don't Bother
Fast Python? Don't Bother
Russel Winder
Making Python computations fast
Making Python computations fast
Russel Winder
Tales from the Workshops
Tales from the Workshops
Russel Winder
Making Computations Execute Very Quickly
Making Computations Execute Very Quickly
Russel Winder
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead, Long Live Ceylon, Kotlin, etc
Russel Winder
GPars Remoting
GPars Remoting
Russel Winder
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Russel Winder
GPars 2014
GPars 2014
Russel Winder
Spocktacular testing
Spocktacular testing
Russel Winder
Spocktacular Testing
Spocktacular Testing
Russel Winder
Is Groovy static or dynamic
Is Groovy static or dynamic
Russel Winder
Java is dead, long live Scala Kotlin Ceylon etc.
Java is dead, long live Scala Kotlin Ceylon etc.
Russel Winder
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you need
Russel Winder
Are Go and D threats to Python
Are Go and D threats to Python
Russel Winder
Is Groovy as fast as Java
Is Groovy as fast as Java
Russel Winder
Who needs C++ when you have D and Go
Who needs C++ when you have D and Go
Russel Winder
Java 8: a New Beginning
Java 8: a New Beginning
Russel Winder
Mehr von Russel Winder
(20)
On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
The Case for Kotlin and Ceylon
The Case for Kotlin and Ceylon
On the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layer
Fast Python? Don't Bother
Fast Python? Don't Bother
Making Python computations fast
Making Python computations fast
Tales from the Workshops
Tales from the Workshops
Making Computations Execute Very Quickly
Making Computations Execute Very Quickly
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead, Long Live Ceylon, Kotlin, etc
GPars Remoting
GPars Remoting
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Java is dead, long live Scala, Kotlin, Ceylon, etc.
GPars 2014
GPars 2014
Spocktacular testing
Spocktacular testing
Spocktacular Testing
Spocktacular Testing
Is Groovy static or dynamic
Is Groovy static or dynamic
Java is dead, long live Scala Kotlin Ceylon etc.
Java is dead, long live Scala Kotlin Ceylon etc.
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you need
Are Go and D threats to Python
Are Go and D threats to Python
Is Groovy as fast as Java
Is Groovy as fast as Java
Who needs C++ when you have D and Go
Who needs C++ when you have D and Go
Java 8: a New Beginning
Java 8: a New Beginning
Kürzlich hochgeladen
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Malak Abu Hammad
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
Khem
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
naman860154
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
Anna Loughnan Colquhoun
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
The Digital Insurer
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
sudhanshuwaghmare1
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
Gabriella Davis
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
The Digital Insurer
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Neo4j
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
Pixlogix Infotech
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
Igalia
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
Rafal Los
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
Delhi Call girls
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
hans926745
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
Enterprise Knowledge
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
apidays
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Enterprise Knowledge
Kürzlich hochgeladen
(20)
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Testing: Python, Java, Groovy, etc.
1.
Testing: Python, Java,
Groovy, etc. Prof Russel Winder http://www.russel.org.uk email: russel@winder.org.uk xmpp: russel@winder.org.uk twitter: @russel_winder Copyright © 2012 Russel Winder 1
2.
Aims, Goals and
Objects ● Look at some practical aspects of testing with Python, Java, and Groovy. ● Consider some of the practical positives and negatives of using test-driven development. † ● Possibly look at coverage as a useful tool for programmers‡. † If time permits. ‡ And a dangerous weapon in the hands of ignorant managers. Copyright © 2012 Russel Winder 2
3.
Structure
Introduction. First part. Short break. Second part. Conclusion. Copyright © 2012 Russel Winder 3
4.
Protocol
● Questions or short comments during the sessions are entirely in order. ● Let me know you have an interjection by raising your hand, and when I come to an appropriate pause, I'll pass you the token. Questions, answers, comments, etc. appearing to get too long as interjections may get stacked to be unstacked at a break. Copyright © 2012 Russel Winder 4
5.
Introduction Copyright © 2012
Russel Winder 5
6.
Russel Winder
● Theoretical Physicist: quarks, strangeness, and charm. ● UNIX systems programmer. ● Academic at UCL: parallel programming, HCI, psychology of programming. ● Professor of Computing Science at KCL: health informatics, parallel programming. Head of Department. ● Starter of start-ups. ● Independent consultant, analyst, author, expert witness, trainer. Copyright © 2012 Russel Winder 6
7.
Interstitial Advertisement Copyright ©
2012 Russel Winder 7
8.
Projects
● Gant ● GroovyBalls ● GPars ● GFontBrowser ● SCons ● Pi_Quadrature ● GroovyFX ● Sleeping_Barber ● Groovy ● Gradle OK, so it's all open source. Copyright © 2012 Russel Winder 8
9.
Testing RW Historically
● The FORTRAN years. ● The C years. ● Early Smalltalk and C++ years. eXtreme Programming ● The Fortran years. ● Early Java years. ● Test-driven Development (TDD) hegemony. ● Feature-Driven Development (FDD). ● Behaviour-driven Development (BDD). Copyright © 2012 Russel Winder 9
10.
A Personal Epiphany
● C codes needs testing. ● C is very difficult re testing. ● Use Python – as long as the C is in a dynamically linked library (aka shared object). Copyright © 2012 Russel Winder 10
11.
The Two Parts Copyright
© 2012 Russel Winder 11
12.
The Terms
● Unit test. ● Integration test. ● System test. ● Acceptance test. Smoke test. Mutation test. Copyright © 2012 Russel Winder 12
13.
Unit Test
● Test the functions and methods for correct behaviour. May well require use of mocks. Copyright © 2012 Russel Winder 13
14.
Integration Test
● Test that combination of bits of the system collaborate in correct ways. Probably needs some use of mocks. Copyright © 2012 Russel Winder 14
15.
System Test
● Test that the system as a whole works as expected. No mocks at all. Smoke test – a pre-test to ensure it is worth running all the tests. Copyright © 2012 Russel Winder 15
16.
Acceptance Test
● Test that the “purchaser” makes to be happy with the system as delivered. Used to be crucial, now contracts are usually not for one-off items, but for annual support. Copyright © 2012 Russel Winder 16
17.
Code under Test Copyright
© 2012 Russel Winder 17
18.
The Tools
● Test frameworks: ● Unit testing Programming language ● Integration testing specific. ● System testing. Acceptance testing usually uses a different sort of tool, FitNesse for example. http://fitnesse.org/ Copyright © 2012 Russel Winder 18
19.
Testing: A Backdrop
● Testing as we know it today has its roots in eXtreme Programming. ● Smalltalk → sUnit ● Python → PyUnit (aka unittest) ● C++ → cppUnit,… ● Java → JUnit Every language created one or many xUnit variants on the assumption it was The right thing to do… …even when it wasn't. Copyright © 2012 Russel Winder 19
20.
The xUnit Legacy
● xUnit is fundamentally grounded in dynamic languages – reflection required. ● Static languages like C++ need a very different approach, hence CUTE, Catch,… using template meta-programming (aka compile time reflection). ● Static languages like Java, can use annotations – still reflection based but better. Copyright © 2012 Russel Winder 20
21.
In the Python-sphere
● PyUnit, aka unittest ● py.test, aka PyTest ● Nose, aka nose There are many others but the above are the ones that matter. Copyright © 2012 Russel Winder 21
22.
In the JVM-sphere
● Java: ● Groovy ● JUnit3 ● GroovyTestCase ● JUnit4 – JUnit3 in disguise ● TestNG ● Spock ● Scala ● Clojure ● ScalaTest ● clojure.test ● ScalaCheck ● Midje ● Specs2 ● lazytest Kotlin, Ceylon, Jython, JRuby,… Copyright © 2012 Russel Winder 22
23.
Being In Control
● For all software developments always use a version control system. † ● Given DVCSs such as Git, Mercurial, Bazaar, there are no excuses for not managing development with a version control system. † Distributed version control system. Copyright © 2012 Russel Winder 23
24.
Individuals / Teams
● Single developer projects need no other tools. ● Multi-developer projects need more infrastructure. Copyright © 2012 Russel Winder 24
25.
Continuous Integration
● A process via which all tests are run for all commits to the mainline repository. ● A continuous integration server monitors the mainline repository. Copyright © 2012 Russel Winder 25
26.
Team Workflow
Continuous delivery Deployment Server Continuous deployment Developer System Test Server Mainline Repository Developer Developer Continuous Integration Developer Developer Copyright © 2012 Russel Winder 26
27.
Buildbot
● FOSS continuous integration framework written in Python: ● Single master. http://trac.buildbot.net/ ● Multiple slaves. http://www.scons.org/ http://buildbot.scons.org/ Copyright © 2012 Russel Winder 27
28.
Atlassian Bamboo
● Commercial continuous integration server, free to FOSS organizations, e.g. Codehaus http://www.atlassian.com/ http://www.codehaus.org/ http://gant.codehaus.org/ Copyright © 2012 Russel Winder 28
29.
JetBrains TeamCity
● Commercial continuous integration server. ● Free support for FOSS projects. ● Cloudy. http://www.jetbrains.com/ http://gpars.codehaus.org/ Copyright © 2012 Russel Winder 29
30.
The Process
Green Fix CUT Refactor New Test Red Copyright © 2012 Russel Winder 30
31.
Test-driven Development
● Never amend your code unless you have a failing test. ● Unless the change is a refactoring. Run all your tests often. Copyright © 2012 Russel Winder 31
32.
Refactoring
● Ensure there are no pending commits prior to a refactoring. ● Run all the tests immediately before a refactoring – ensure you get a green. ● Run all the tests immediately after a refactoring – ensure you get a green. ● If a refactoring leads to a red, back out of all the changes. ● Run the tests and ensure you get a green. Copyright © 2012 Russel Winder 32
33.
Unit Testing and
Mocks ● System testing done within a constrained real system not live. ● Unit and integration testing needs to disconnect from some resources. Copyright © 2012 Russel Winder 33
34.
A short
Monty Python moment… Copyright © 2012 Russel Winder 34
35.
Copyright © 2012
Russel Winder 35
36.
A Short Coding
Dojo Copyright © 2012 Russel Winder 36
37.
Conclusion Copyright © 2012
Russel Winder 37
38.
Testing
● It's what programmers do. Copyright © 2012 Russel Winder 38
39.
Version Control
● It's the way programmers work. Copyright © 2012 Russel Winder 39
40.
Interstitial Advertisement Copyright ©
2012 Russel Winder 40
41.
Testing: Python, Java,
Groovy, etc. Prof Russel Winder http://www.russel.org.uk email: russel@winder.org.uk xmpp: russel@winder.org.uk twitter: @russel_winder Copyright © 2012 Russel Winder 41
Jetzt herunterladen