Automatisiertes Testen ist zum Standard in der PHP-Welt avanciert. Aber ist Ihre Test-Suite immer noch State of the Art? Nutzen Sie die neuesten Features, um sich das Testleben einfacher zu machen? Sind Ihre Tests verlässlich? Lernen Sie, was en vogue ist in der PHP-Testwelt im Jahr 2012.
http://talks.qafoo.com
Wie überprüfen Sie, dass eine Applikation die Leistungsanforderungen auch bei komplexen Nutzerinteraktionen erfüllt? Es gibt eine Welt jenseits von Bench und Siege: JMeter kann Nutzerinteraktionen simulieren, komplexe Cluster-Setups messen und lässt sich in jedes Continuous Integration Setup integrieren. Wir zeigen, wie JMeter verwendet werden kann um Performance kontinuierlich zu überwachen.
http://talks.qafoo.com
Gergely Bobkó is a chartered accountant born in 1987 living in Budapest, Hungary. He received a degree in tourism from Budapest College of Communication and Business in 2012 and became a chartered accountant in 2015. His work experience includes positions as an AP accountant at IBM Hungary from 2013-present, an accountant intern at Bán Szerva Kft. in 2013, a waiter at Apostolok Hungarian Restaurant from 2012-2013, and a receptionist at hotels in Hungary and the United States from 2011-2007. He has strong English, German, and computer skills and experience with accounting, administration, and customer service.
Project center in trichy @ieee 2016 17 titles for java and dotnetTripleN Infotech
IEEE Final Year Projects for M.E/M.TECH,B.E-CSE/IT from any domain & Technologies.For more detail contact:-DreamWeb TechnoSolutions@7200021403/04, 73/5 3rd floor,Kamatchi cmplx,Thillai nagar 1st cross,Trichy.
El documento proporciona instrucciones en 3 pasos para subir un documento a Slideshare: 1) buscar Slideshare en Google e ingresar al sitio web, 2) registrarse creando una cuenta con correo electrónico, nombre de usuario y contraseña, y 3) seleccionar el botón naranja "subir" para buscar y seleccionar el documento a publicar, agregar un título y descripción, y luego publicarlo.
Wie überprüfen Sie, dass eine Applikation die Leistungsanforderungen auch bei komplexen Nutzerinteraktionen erfüllt? Es gibt eine Welt jenseits von Bench und Siege: JMeter kann Nutzerinteraktionen simulieren, komplexe Cluster-Setups messen und lässt sich in jedes Continuous Integration Setup integrieren. Wir zeigen, wie JMeter verwendet werden kann um Performance kontinuierlich zu überwachen.
http://talks.qafoo.com
Gergely Bobkó is a chartered accountant born in 1987 living in Budapest, Hungary. He received a degree in tourism from Budapest College of Communication and Business in 2012 and became a chartered accountant in 2015. His work experience includes positions as an AP accountant at IBM Hungary from 2013-present, an accountant intern at Bán Szerva Kft. in 2013, a waiter at Apostolok Hungarian Restaurant from 2012-2013, and a receptionist at hotels in Hungary and the United States from 2011-2007. He has strong English, German, and computer skills and experience with accounting, administration, and customer service.
Project center in trichy @ieee 2016 17 titles for java and dotnetTripleN Infotech
IEEE Final Year Projects for M.E/M.TECH,B.E-CSE/IT from any domain & Technologies.For more detail contact:-DreamWeb TechnoSolutions@7200021403/04, 73/5 3rd floor,Kamatchi cmplx,Thillai nagar 1st cross,Trichy.
El documento proporciona instrucciones en 3 pasos para subir un documento a Slideshare: 1) buscar Slideshare en Google e ingresar al sitio web, 2) registrarse creando una cuenta con correo electrónico, nombre de usuario y contraseña, y 3) seleccionar el botón naranja "subir" para buscar y seleccionar el documento a publicar, agregar un título y descripción, y luego publicarlo.
Os solos formam-se a partir da decomposição da rocha e matéria orgânica ao longo do tempo, sendo influenciados por fatores como relevo, clima e vegetação. Os diferentes tipos de solo afetam a agricultura e a biodiversidade de cada região. A formação dos solos é um processo lento que requer centenas ou milhares de anos.
The Jefferson Council on Aging is inviting the public to a free event on November 11th from 8am to noon at the Pontchartrain Center in Kenner. The event will include senior exercise classes followed by a meet and greet with a famous New Orleans fitness instructor. All ages are welcome to attend the fitness-themed event.
The document is a curriculum vitae for Jaun Abbas. It outlines his professional experience working in operations roles for three companies from 2010 to present, including his current role as Assistant Manager at IQAG Pvt. Ltd. since 2015. It also lists his responsibilities, qualifications including a B.Com graduate degree, and personal details.
Rewriting The Revenue Rules: From Mobile-First To Mobile-Only Mobile Shopping...SOASTA
This document discusses how slow loading times and delays can negatively impact businesses. It notes that a 1 second delay can lead to 11% fewer page views, 16% less customer satisfaction, and 7% loss in conversion. Additionally, 3 out of 4 mobile users consider mobile sites slower than desktop sites. The document then discusses how SOASTA helps companies analyze performance data to answer key questions and improve user experiences.
This document provides information about using a slide projector. It describes the key components of a slide projector, including the light source, reflector, condensing lens, slide holder, and focusing lens. It explains that slides are loaded into a carousel that holds approximately 80 slides. The document outlines the basic steps to use a slide projector, such as gathering the slides, loading them into the carousel, powering on the projector, focusing the first slide, advancing through slides using buttons, and powering off when finished.
PHP 4? OMG! A small vademecum for obsolete software migration.Francesco Fullone
This document provides guidance for migrating from PHP 4 to PHP 5. It recommends creating a comprehensive test suite to test core functionality, workflows, third party interactions, and classes. It also suggests checking for outdated libraries, code smells, dependencies, and PHP settings. The migration process should happen iteratively, upgrading PHP and the system in stages while using the test suite and fixing any issues. Once the core upgrade is complete, more refactoring is needed such as improving tests, following standard patterns, using frameworks, removing unused code, and more. The overall process helps ensure a smooth transition from obsolete to current software.
The document discusses Joel Spolsky's "Joel Test" which evaluates software development teams. It applies the test's 12 questions to PHP teams and provides recommendations. Key points include using source control, continuous integration, bug tracking, specifications, estimating tasks, and providing developers with resources to do their jobs.
PHP 5.4 - Begin your love affair with traitsGraham Weldon
This document discusses PHP 5.4 and introduces new features such as traits, array dereferencing, binary notation, and upload progress tracking. It provides examples of using traits to reuse code across classes without complicated inheritance. Traits allow for small reusable code sections that can be included in any class while maintaining a precedence order. The document encourages early adoption of new PHP versions for cleaner code and new language features, while also advising testing before deploying to production.
The document summarizes a presentation given by Dave Ross on PHPUnit, an automated unit testing framework for PHP. It describes what unit testing is, how PHPUnit works, examples of writing and running PHPUnit test cases, and how automated testing supports continuous integration by running tests regularly as code is checked in.
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T Puppet
Here are the slides from Rob Nelson's PuppetConf 2016 presentation called Enjoying the Journey from Puppet 3.x to 4.x. Watch the videos at https://www.youtube.com/playlist?list=PLV86BgbREluVjwwt-9UL8u2Uy8xnzpIqa
Matteo Ferrabone is currently a firmware engineer at Inpeco S.p.a. in Italy where he develops interface modules between medical laboratory automation and third party analyzers as well as porting legacy firmware to a new embedded Linux architecture. Previously he was a post-doc at the University of Turin developing theoretical methods for the ab-initio code CRYSTAL. He holds a PhD in Chemistry from the University of Turin and has experience in areas such as ANSI C, Fortran, embedded Linux, numerical methods, parallel programming, and quantum chemistry. In his spare time he enjoys playing bass guitar, physical activity, martial arts, and programming Android apps and DSP devices.
Enjoying the Journey from Puppet 3.x to Puppet 4.x (PuppetConf 2016)Robert Nelson
Let's describe the process for upgrading from Puppet 3 to 4, list some common pitfalls and how to avoid them, and be sure to enjoy ourselves in the process!
The document provides an introduction to the World Wide Web and basics of PHP programming language. It discusses what the internet and WWW are, how HTTP works, basics of web application development. It then covers installing WAMP or XAMPP on Windows, history and features of PHP versions. Common PHP concepts like variables, data types, operators, control structures like loops and conditional statements are explained.
Codeception Testing Framework -- English #phpkansaiFlorent Batard
The document discusses introducing Codeception, a PHP testing framework. It begins with an agenda that includes a presentation on Codeception, different test types, a demonstration, and best practices. It then introduces the speaker, Florent Batard, who is a security engineer and web developer from France. He explains why testing is important for reducing assumptions and validating that code runs as expected. The bulk of the document then focuses on Codeception, explaining what it is, how it works, the different types of tests it supports including acceptance, functional, and unit tests, and how to install and use it. Code examples are provided and it concludes with referencing materials and opening the floor for questions.
Pharo's testing infrastructure is great and makes test-driven development process easy to set-up.
However, some things can still be improved to make the testing experiment even better.
This talk explores new directions to be taken to enhance the actual infrastructure.
1. The document discusses enhancing the testing experience in Pharo by developing DrTests as a new plugin-based testing UI written in Spec.
2. DrTests would provide a uniform API for running tests via plugins and displaying results in an extensible manner.
3. The goal is to create a testing ecosystem in Pharo that is integrated, extensible via plugins, and able to evolve over time.
Aspect oriented programming (AOP) allows developers to separate cross-cutting concerns from the main application code. This helps keep code organized and focused on single responsibilities. AOP works by defining points in the program execution, called join points, where additional behavior can be inserted. This additional behavior is defined through advice that runs before, after, or around join points. Pointcuts are used to identify which join points specific advice should apply to. Aspects group advice and pointcuts to encapsulate a concern.
[drupalday2017] - Behat per Drupal: test automatici e molto di piùDrupalDay
Behat è nato per semplificare il processo di accettazione da parte del cliente: per evitare ambiguità si realizza un test automatico (leggibile anche da chi non ha competenze tecniche) la cui esecuzione con successo garantisce che le specifiche siano rispettate. L'integrazione di Behat nel processo di sviluppo Drupal permette tuttavia di andare ben oltre: si può usare Behat per condividere le specifiche con il cliente, per guidare lo sviluppo (scrivendo il test prima del codice), per assistere il debug (usando uno scenario per popolare una situazione di errore ripetibile) e persino per migrare un sito da Drupal 7 a Drupal 8 (codificando il comportamento del sito in una serie di test che vengono poi usati come base per lo sviluppo del nuovo sito). Per tutti gli scenari descritti vedremo esempi basati sull'esperienza di Nuvole.
di Andrea Pescetti
Os solos formam-se a partir da decomposição da rocha e matéria orgânica ao longo do tempo, sendo influenciados por fatores como relevo, clima e vegetação. Os diferentes tipos de solo afetam a agricultura e a biodiversidade de cada região. A formação dos solos é um processo lento que requer centenas ou milhares de anos.
The Jefferson Council on Aging is inviting the public to a free event on November 11th from 8am to noon at the Pontchartrain Center in Kenner. The event will include senior exercise classes followed by a meet and greet with a famous New Orleans fitness instructor. All ages are welcome to attend the fitness-themed event.
The document is a curriculum vitae for Jaun Abbas. It outlines his professional experience working in operations roles for three companies from 2010 to present, including his current role as Assistant Manager at IQAG Pvt. Ltd. since 2015. It also lists his responsibilities, qualifications including a B.Com graduate degree, and personal details.
Rewriting The Revenue Rules: From Mobile-First To Mobile-Only Mobile Shopping...SOASTA
This document discusses how slow loading times and delays can negatively impact businesses. It notes that a 1 second delay can lead to 11% fewer page views, 16% less customer satisfaction, and 7% loss in conversion. Additionally, 3 out of 4 mobile users consider mobile sites slower than desktop sites. The document then discusses how SOASTA helps companies analyze performance data to answer key questions and improve user experiences.
This document provides information about using a slide projector. It describes the key components of a slide projector, including the light source, reflector, condensing lens, slide holder, and focusing lens. It explains that slides are loaded into a carousel that holds approximately 80 slides. The document outlines the basic steps to use a slide projector, such as gathering the slides, loading them into the carousel, powering on the projector, focusing the first slide, advancing through slides using buttons, and powering off when finished.
PHP 4? OMG! A small vademecum for obsolete software migration.Francesco Fullone
This document provides guidance for migrating from PHP 4 to PHP 5. It recommends creating a comprehensive test suite to test core functionality, workflows, third party interactions, and classes. It also suggests checking for outdated libraries, code smells, dependencies, and PHP settings. The migration process should happen iteratively, upgrading PHP and the system in stages while using the test suite and fixing any issues. Once the core upgrade is complete, more refactoring is needed such as improving tests, following standard patterns, using frameworks, removing unused code, and more. The overall process helps ensure a smooth transition from obsolete to current software.
The document discusses Joel Spolsky's "Joel Test" which evaluates software development teams. It applies the test's 12 questions to PHP teams and provides recommendations. Key points include using source control, continuous integration, bug tracking, specifications, estimating tasks, and providing developers with resources to do their jobs.
PHP 5.4 - Begin your love affair with traitsGraham Weldon
This document discusses PHP 5.4 and introduces new features such as traits, array dereferencing, binary notation, and upload progress tracking. It provides examples of using traits to reuse code across classes without complicated inheritance. Traits allow for small reusable code sections that can be included in any class while maintaining a precedence order. The document encourages early adoption of new PHP versions for cleaner code and new language features, while also advising testing before deploying to production.
The document summarizes a presentation given by Dave Ross on PHPUnit, an automated unit testing framework for PHP. It describes what unit testing is, how PHPUnit works, examples of writing and running PHPUnit test cases, and how automated testing supports continuous integration by running tests regularly as code is checked in.
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T Puppet
Here are the slides from Rob Nelson's PuppetConf 2016 presentation called Enjoying the Journey from Puppet 3.x to 4.x. Watch the videos at https://www.youtube.com/playlist?list=PLV86BgbREluVjwwt-9UL8u2Uy8xnzpIqa
Matteo Ferrabone is currently a firmware engineer at Inpeco S.p.a. in Italy where he develops interface modules between medical laboratory automation and third party analyzers as well as porting legacy firmware to a new embedded Linux architecture. Previously he was a post-doc at the University of Turin developing theoretical methods for the ab-initio code CRYSTAL. He holds a PhD in Chemistry from the University of Turin and has experience in areas such as ANSI C, Fortran, embedded Linux, numerical methods, parallel programming, and quantum chemistry. In his spare time he enjoys playing bass guitar, physical activity, martial arts, and programming Android apps and DSP devices.
Enjoying the Journey from Puppet 3.x to Puppet 4.x (PuppetConf 2016)Robert Nelson
Let's describe the process for upgrading from Puppet 3 to 4, list some common pitfalls and how to avoid them, and be sure to enjoy ourselves in the process!
The document provides an introduction to the World Wide Web and basics of PHP programming language. It discusses what the internet and WWW are, how HTTP works, basics of web application development. It then covers installing WAMP or XAMPP on Windows, history and features of PHP versions. Common PHP concepts like variables, data types, operators, control structures like loops and conditional statements are explained.
Codeception Testing Framework -- English #phpkansaiFlorent Batard
The document discusses introducing Codeception, a PHP testing framework. It begins with an agenda that includes a presentation on Codeception, different test types, a demonstration, and best practices. It then introduces the speaker, Florent Batard, who is a security engineer and web developer from France. He explains why testing is important for reducing assumptions and validating that code runs as expected. The bulk of the document then focuses on Codeception, explaining what it is, how it works, the different types of tests it supports including acceptance, functional, and unit tests, and how to install and use it. Code examples are provided and it concludes with referencing materials and opening the floor for questions.
Pharo's testing infrastructure is great and makes test-driven development process easy to set-up.
However, some things can still be improved to make the testing experiment even better.
This talk explores new directions to be taken to enhance the actual infrastructure.
1. The document discusses enhancing the testing experience in Pharo by developing DrTests as a new plugin-based testing UI written in Spec.
2. DrTests would provide a uniform API for running tests via plugins and displaying results in an extensible manner.
3. The goal is to create a testing ecosystem in Pharo that is integrated, extensible via plugins, and able to evolve over time.
Aspect oriented programming (AOP) allows developers to separate cross-cutting concerns from the main application code. This helps keep code organized and focused on single responsibilities. AOP works by defining points in the program execution, called join points, where additional behavior can be inserted. This additional behavior is defined through advice that runs before, after, or around join points. Pointcuts are used to identify which join points specific advice should apply to. Aspects group advice and pointcuts to encapsulate a concern.
[drupalday2017] - Behat per Drupal: test automatici e molto di piùDrupalDay
Behat è nato per semplificare il processo di accettazione da parte del cliente: per evitare ambiguità si realizza un test automatico (leggibile anche da chi non ha competenze tecniche) la cui esecuzione con successo garantisce che le specifiche siano rispettate. L'integrazione di Behat nel processo di sviluppo Drupal permette tuttavia di andare ben oltre: si può usare Behat per condividere le specifiche con il cliente, per guidare lo sviluppo (scrivendo il test prima del codice), per assistere il debug (usando uno scenario per popolare una situazione di errore ripetibile) e persino per migrare un sito da Drupal 7 a Drupal 8 (codificando il comportamento del sito in una serie di test che vengono poi usati come base per lo sviluppo del nuovo sito). Per tutti gli scenari descritti vedremo esempi basati sull'esperienza di Nuvole.
di Andrea Pescetti
Vibrant Technologies is headquarted in Mumbai,India.We are the best php training provider in Navi Mumbai who provides Live Projects to students.We provide Corporate Training also.We are Best php classes in Mumbai according to our students and corporators
The document summarizes techniques for industrializing PHP development. It discusses releasing code ownership, capitalizing on work, and involving users. Specific techniques include: using code conventions and IDEs; version control; unit testing; automated deployment; bug tracking; functional testing; continuous integration; agile methodologies; and documentation. The goal is to scale development through established practices, reusable code, feedback loops, and collaboration.
Theory and practice – migrating your legacy code into our modern test drive...Lars Jankowfsky
This document discusses strategies for migrating legacy PHP code to a more modern test-driven development approach. It begins with an introduction to legacy code and the agenda. It then discusses typical problems with legacy PHP projects, such as spaghetti code and lack of testing. The document provides strategies for introducing test-driven development practices like writing tests first, refactoring, and using fixtures. It emphasizes incremental changes over a full rewrite to safely evolve the code over time.
A presentation I originally gave at the 5th Girl Geek Dinner Milano October 24th, 2008 with the contribution of Bruna Gardella. An introduction to Open Source, the world of women and Open Source, and the Girl Geek and Open Source.
* What is Open Source (OS)
* Why Open Source
* Open Source in the world
* The Girl Geek and the Open Source World
* How to Contribute
* Appendix A: Some Open Source Alternatives for Proprietary Software
This document summarizes Richard Shea's presentation on Plone use at the Cuba Group. It discusses how Plone has been used at Cuba Group for over 3 years, initially as an experiment. Plone provides a centralized knowledge base, standards, resources, and documentation. It allows for consistency, searchability, and document management. Plone's extendability provides many options through add-ons. Richard highlights three add-ons he likes: OpenXML for searching Office files, PloneArticle for enhanced page layouts, and wsapi4plone for a web services API.
Threats to mobile devices are more prevalent and increasing in scope and complexity. Users of mobile devices desire to take full advantage of the features
available on those devices, but many of the features provide convenience and capability but sacrifice security. This best practices guide outlines steps the users can take to better protect personal devices and information.
Digital Marketing Trends in 2024 | Guide for Staying AheadWask
https://www.wask.co/ebooks/digital-marketing-trends-in-2024
Feeling lost in the digital marketing whirlwind of 2024? Technology is changing, consumer habits are evolving, and staying ahead of the curve feels like a never-ending pursuit. This e-book is your compass. Dive into actionable insights to handle the complexities of modern marketing. From hyper-personalization to the power of user-generated content, learn how to build long-term relationships with your audience and unlock the secrets to success in the ever-shifting digital landscape.
Best 20 SEO Techniques To Improve Website Visibility In SERPPixlogix Infotech
Boost your website's visibility with proven SEO techniques! Our latest blog dives into essential strategies to enhance your online presence, increase traffic, and rank higher on search engines. From keyword optimization to quality content creation, learn how to make your site stand out in the crowded digital landscape. Discover actionable tips and expert insights to elevate your SEO game.
Introduction of Cybersecurity with OSS at Code Europe 2024Hiroshi SHIBATA
I develop the Ruby programming language, RubyGems, and Bundler, which are package managers for Ruby. Today, I will introduce how to enhance the security of your application using open-source software (OSS) examples from Ruby and RubyGems.
The first topic is CVE (Common Vulnerabilities and Exposures). I have published CVEs many times. But what exactly is a CVE? I'll provide a basic understanding of CVEs and explain how to detect and handle vulnerabilities in OSS.
Next, let's discuss package managers. Package managers play a critical role in the OSS ecosystem. I'll explain how to manage library dependencies in your application.
I'll share insights into how the Ruby and RubyGems core team works to keep our ecosystem safe. By the end of this talk, you'll have a better understanding of how to safeguard your code.
How to Get CNIC Information System with Paksim Ga.pptxdanishmna97
Pakdata Cf is a groundbreaking system designed to streamline and facilitate access to CNIC information. This innovative platform leverages advanced technology to provide users with efficient and secure access to their CNIC details.
Ivanti’s Patch Tuesday breakdown goes beyond patching your applications and brings you the intelligence and guidance needed to prioritize where to focus your attention first. Catch early analysis on our Ivanti blog, then join industry expert Chris Goettl for the Patch Tuesday Webinar Event. There we’ll do a deep dive into each of the bulletins and give guidance on the risks associated with the newly-identified vulnerabilities.
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Speck&Tech
ABSTRACT: A prima vista, un mattoncino Lego e la backdoor XZ potrebbero avere in comune il fatto di essere entrambi blocchi di costruzione, o dipendenze di progetti creativi e software. La realtà è che un mattoncino Lego e il caso della backdoor XZ hanno molto di più di tutto ciò in comune.
Partecipate alla presentazione per immergervi in una storia di interoperabilità, standard e formati aperti, per poi discutere del ruolo importante che i contributori hanno in una comunità open source sostenibile.
BIO: Sostenitrice del software libero e dei formati standard e aperti. È stata un membro attivo dei progetti Fedora e openSUSE e ha co-fondato l'Associazione LibreItalia dove è stata coinvolta in diversi eventi, migrazioni e formazione relativi a LibreOffice. In precedenza ha lavorato a migrazioni e corsi di formazione su LibreOffice per diverse amministrazioni pubbliche e privati. Da gennaio 2020 lavora in SUSE come Software Release Engineer per Uyuni e SUSE Manager e quando non segue la sua passione per i computer e per Geeko coltiva la sua curiosità per l'astronomia (da cui deriva il suo nickname deneb_alpha).
In the rapidly evolving landscape of technologies, XML continues to play a vital role in structuring, storing, and transporting data across diverse systems. The recent advancements in artificial intelligence (AI) present new methodologies for enhancing XML development workflows, introducing efficiency, automation, and intelligent capabilities. This presentation will outline the scope and perspective of utilizing AI in XML development. The potential benefits and the possible pitfalls will be highlighted, providing a balanced view of the subject.
We will explore the capabilities of AI in understanding XML markup languages and autonomously creating structured XML content. Additionally, we will examine the capacity of AI to enrich plain text with appropriate XML markup. Practical examples and methodological guidelines will be provided to elucidate how AI can be effectively prompted to interpret and generate accurate XML markup.
Further emphasis will be placed on the role of AI in developing XSLT, or schemas such as XSD and Schematron. We will address the techniques and strategies adopted to create prompts for generating code, explaining code, or refactoring the code, and the results achieved.
The discussion will extend to how AI can be used to transform XML content. In particular, the focus will be on the use of AI XPath extension functions in XSLT, Schematron, Schematron Quick Fixes, or for XML content refactoring.
The presentation aims to deliver a comprehensive overview of AI usage in XML development, providing attendees with the necessary knowledge to make informed decisions. Whether you’re at the early stages of adopting AI or considering integrating it in advanced XML development, this presentation will cover all levels of expertise.
By highlighting the potential advantages and challenges of integrating AI with XML development tools and languages, the presentation seeks to inspire thoughtful conversation around the future of XML development. We’ll not only delve into the technical aspects of AI-powered XML development but also discuss practical implications and possible future directions.
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slackshyamraj55
Discover the seamless integration of RPA (Robotic Process Automation), COMPOSER, and APM with AWS IDP enhanced with Slack notifications. Explore how these technologies converge to streamline workflows, optimize performance, and ensure secure access, all while leveraging the power of AWS IDP and real-time communication via Slack notifications.
UiPath Test Automation using UiPath Test Suite series, part 6DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 6. In this session, we will cover Test Automation with generative AI and Open AI.
UiPath Test Automation with generative AI and Open AI webinar offers an in-depth exploration of leveraging cutting-edge technologies for test automation within the UiPath platform. Attendees will delve into the integration of generative AI, a test automation solution, with Open AI advanced natural language processing capabilities.
Throughout the session, participants will discover how this synergy empowers testers to automate repetitive tasks, enhance testing accuracy, and expedite the software testing life cycle. Topics covered include the seamless integration process, practical use cases, and the benefits of harnessing AI-driven automation for UiPath testing initiatives. By attending this webinar, testers, and automation professionals can gain valuable insights into harnessing the power of AI to optimize their test automation workflows within the UiPath ecosystem, ultimately driving efficiency and quality in software development processes.
What will you get from this session?
1. Insights into integrating generative AI.
2. Understanding how this integration enhances test automation within the UiPath platform
3. Practical demonstrations
4. Exploration of real-world use cases illustrating the benefits of AI-driven test automation for UiPath
Topics covered:
What is generative AI
Test Automation with generative AI and Open AI.
UiPath integration with generative AI
Speaker:
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Taking AI to the Next Level in Manufacturing.pdfssuserfac0301
Read Taking AI to the Next Level in Manufacturing to gain insights on AI adoption in the manufacturing industry, such as:
1. How quickly AI is being implemented in manufacturing.
2. Which barriers stand in the way of AI adoption.
3. How data quality and governance form the backbone of AI.
4. Organizational processes and structures that may inhibit effective AI adoption.
6. Ideas and approaches to help build your organization's AI strategy.
Generating privacy-protected synthetic data using Secludy and MilvusZilliz
During this demo, the founders of Secludy will demonstrate how their system utilizes Milvus to store and manipulate embeddings for generating privacy-protected synthetic data. Their approach not only maintains the confidentiality of the original data but also enhances the utility and scalability of LLMs under privacy constraints. Attendees, including machine learning engineers, data scientists, and data managers, will witness first-hand how Secludy's integration with Milvus empowers organizations to harness the power of LLMs securely and efficiently.
1. Testen State of the Art
IPC Spring 2012
Manuel Pichler (@manuelp)
Tobias Schlitt (@tobySen)
2012-06-04
Testen State of the Art 1 / 40
2. About us
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Open source enthusiasts
Contributing to various
FLOSS projects
Testen State of the Art 2 / 40
3. About us
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Open source enthusiasts
Contributing to various
FLOSS projects
Testen State of the Art 2 / 40
4. About us
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Open source enthusiasts
Contributing to various
FLOSS projects
Testen State of the Art 2 / 40
5. About us
Co-founders of
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Open source enthusiasts
Contributing to various
FLOSS projects
Testen State of the Art 2 / 40
6. About us
Co-founders of
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Helping people to create
Open source enthusiasts high quality web
Contributing to various applications.
FLOSS projects
Testen State of the Art 2 / 40
7. About us
Co-founders of
Manuel & Toby
Degree in computer sience
More than 10 years of
Qafoo
passion for software quality
professional PHP
Helping people to create
Open source enthusiasts high quality web
Contributing to various applications.
FLOSS projects
http://qafoo.com
Testen State of the Art 2 / 40
8. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 3 / 40
9. PHPUnit schematics
TestRunner
MyComponentSuite TestSuite
MyClassTest TestCase
MyClass
Testen State of the Art 4 / 40
10. PHPUnit schematics
TestRunner
MyComponentSuite TestSuite
MyClassTest TestCase
MyClass
Testen State of the Art 4 / 40
11. Test suites
File system based
phpunit.dist.xml / phpunit.xml
@group annotations
Testen State of the Art 5 / 40
12. phpunit.xml
In the dir you execute $ phpunit
phpunit.xml available?
phpunit.dist.xml available?
$ phpunit -c my-phpunit.xml
Testen State of the Art 6 / 40
13. phpunit.xml
1 < p h p u n i t b o o t s t r a p = ” l i b r a r i e s / a u t o l o a d . php ”
2 colors=” true ”
3 convertErrorsToExceptions=” true ”
4 convertNoticesToExceptions= ” true ”
5 convertWarningsToExceptions = ” t r u e ”
6 >
7 < groups>
8 < exclude >< group> i n t e g r a t i o n < / group>< / exclude >
9 < / groups>
10
11 <t e s t s u i t e s>
12 < t e s t s u i t e name= ” A l l Tests ” >
13 < d i r e c t o r y s u f f i x = ” . php ” > t e s t s / < / d i r e c t o r y >
14 </ t e s t s u i t e>
15 </ t e s t s u i t e s>
16
17 <filter>
18 <w h i t e l i s t>
19 < d i r e c t o r y s u f f i x = ” . php ” > . . / s r c / < / d i r e c t o r y >
20 < exclude >
21 < f i l e > . . / s r c / b o o t s t r a p . php< / f i l e >
22 < / exclude >
23 </ w h i t e l i s t>
24 </ f i l t e r >
25 < / p h p u n i t>
Testen State of the Art 7 / 40
14. phpunit.xml
1 < p h p u n i t b o o t s t r a p = ” l i b r a r i e s / a u t o l o a d . php ”
2 colors=” true ”
3 convertErrorsToExceptions=” true ”
4 convertNoticesToExceptions= ” true ”
5 convertWarningsToExceptions = ” t r u e ”
6 >
7 < groups>
8 < exclude >< group> i n t e g r a t i o n < / group>< / exclude >
9 < / groups>
10
11 <t e s t s u i t e s>
12 < t e s t s u i t e name= ” A l l Tests ” >
13 < d i r e c t o r y s u f f i x = ” . php ” > t e s t s / < / d i r e c t o r y >
14 </ t e s t s u i t e>
15 </ t e s t s u i t e s>
16
17 <filter>
18 <w h i t e l i s t>
19 < d i r e c t o r y s u f f i x = ” . php ” > . . / s r c / < / d i r e c t o r y >
20 < exclude >
21 < f i l e > . . / s r c / b o o t s t r a p . php< / f i l e >
22 < / exclude >
23 </ w h i t e l i s t>
24 </ f i l t e r >
25 < / p h p u n i t>
Testen State of the Art 7 / 40
15. phpunit.xml
1 < p h p u n i t b o o t s t r a p = ” l i b r a r i e s / a u t o l o a d . php ”
2 colors=” true ”
3 convertErrorsToExceptions=” true ”
4 convertNoticesToExceptions= ” true ”
5 convertWarningsToExceptions = ” t r u e ”
6 >
7 < groups>
8 < exclude >< group> i n t e g r a t i o n < / group>< / exclude >
9 < / groups>
10
11 <t e s t s u i t e s>
12 < t e s t s u i t e name= ” A l l Tests ” >
13 < d i r e c t o r y s u f f i x = ” . php ” > t e s t s / < / d i r e c t o r y >
14 </ t e s t s u i t e>
15 </ t e s t s u i t e s>
16
17 <filter>
18 <w h i t e l i s t>
19 < d i r e c t o r y s u f f i x = ” . php ” > . . / s r c / < / d i r e c t o r y >
20 < exclude >
21 < f i l e > . . / s r c / b o o t s t r a p . php< / f i l e >
22 < / exclude >
23 </ w h i t e l i s t>
24 </ f i l t e r >
25 < / p h p u n i t>
Testen State of the Art 7 / 40
16. phpunit.xml
1 < p h p u n i t b o o t s t r a p = ” l i b r a r i e s / a u t o l o a d . php ”
2 colors=” true ”
3 convertErrorsToExceptions=” true ”
4 convertNoticesToExceptions= ” true ”
5 convertWarningsToExceptions = ” t r u e ”
6 >
7 < groups>
8 < exclude >< group> i n t e g r a t i o n < / group>< / exclude >
9 < / groups>
10
11 <t e s t s u i t e s>
12 < t e s t s u i t e name= ” A l l Tests ” >
13 < d i r e c t o r y s u f f i x = ” . php ” > t e s t s / < / d i r e c t o r y >
14 </ t e s t s u i t e>
15 </ t e s t s u i t e s>
16
17 <filter>
18 <w h i t e l i s t>
19 < d i r e c t o r y s u f f i x = ” . php ” > . . / s r c / < / d i r e c t o r y >
20 < exclude >
21 < f i l e > . . / s r c / b o o t s t r a p . php< / f i l e >
22 < / exclude >
23 </ w h i t e l i s t>
24 </ f i l t e r >
25 < / p h p u n i t>
Testen State of the Art 7 / 40
17. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
18. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
19. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
20. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
21. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
22. Useful Annotations
@covers
@group
@ticket
@dataProvider
@expectedException*
@codeCoverageIgnore*
@depends
Testen State of the Art 8 / 40
23. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 9 / 40
24. A Minimal File Upload
1 <?php
2 class UploadExample
3 {
4 protected $dest ;
5 public function c o n s t r u c t ( $dest )
6 {
7 $ t h i s −> d e s t = r t r i m ( $dest , ’ / ’ ) . ’ / ’ ;
8 }
9 public function handle ( $name )
10 {
11 i f ( i s u p l o a d e d f i l e ( $ FILES [ $name ] [ ’ tmp name ’ ] ) ) {
12 move uploaded file (
13 $ FILES [ $name ] [ ’ tmp name ’ ] ,
14 $ t h i s −> d e s t . $ FILES [ $name ] [ ’ name ’ ]
15 );
16 }
17 }
18 }
Testen State of the Art 10 / 40
25. A Minimal File Upload
1 <?php
2 class UploadExample
3 {
4 protected $dest ;
5 public function c o n s t r u c t ( $dest )
6 {
7 $ t h i s −> d e s t = r t r i m ( $dest , ’ / ’ ) . ’ / ’ ;
8 }
9 public function handle ( $name )
10 {
11 i f ( i s u p l o a d e d f i l e ( $ FILES [ $name ] [ ’ tmp name ’ ] ) ) {
12 move uploaded file (
13 $ FILES [ $name ] [ ’ tmp name ’ ] ,
14 $ t h i s −> d e s t . $ FILES [ $name ] [ ’ name ’ ]
15 );
16 }
17 }
18 }
Testen State of the Art 10 / 40
26. PHPT
PHP Testing Framework (PHPT)
Used to test PHP core
$ pear run-tests example-test-case.phpt
Integrates into PHPUnit
Details: http://qa.php.net/phpt_details.php
Testen State of the Art 11 / 40
27. A Simple PHPT Test
1 −−TEST−−
2 Example t e s t case
3 −−FILE −−
4 <?php
5 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’P ’ ) ) ;
6 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’ Z ’ ) ) ;
7 −−EXPECT−−
8 int (7)
9 bool ( false )
Testen State of the Art 12 / 40
28. A Simple PHPT Test
1 −−TEST−−
2 Example t e s t case
3 −−FILE −−
4 <?php
5 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’P ’ ) ) ;
6 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’ Z ’ ) ) ;
7 −−EXPECT−−
8 int (7)
9 bool ( false )
Testen State of the Art 12 / 40
29. A Simple PHPT Test
1 −−TEST−−
2 Example t e s t case
3 −−FILE −−
4 <?php
5 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’P ’ ) ) ;
6 var dump ( s t r p o s ( ’ Manuel P i c h l e r ’ , ’ Z ’ ) ) ;
7 −−EXPECT−−
8 int (7)
9 bool ( false )
Testen State of the Art 12 / 40
30. File Uploads with PHPT
1 −−TEST−−
2 Example t e s t e m u l a t i n g a f i l e upload
3 −−POST RAW−−
4 Content −Type : m u l t i p a r t / form − data ; boundary=−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
5
6 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
7 Content − D i s p o s i t i o n : form − data ; name= ” f i l e ” ; f i l e n a m e = ” example . t x t ”
8 Content −Type : t e x t / p l a i n
9
10 Qafoo p r o v i d e s q u a l i t y assurance s u p p o r t and c o n s u l t i n g
11
12 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
13 Content − D i s p o s i t i o n : form − data ; name= ” submit ”
14
15 Upload
16 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn −−
17 −−FILE −−
18 <?php
19 require DIR . ’ / UploadExample . php ’ ;
20
21 $upload = new UploadExample ( ’ / tmp ’ ) ;
22 $upload −> handle ( ’ f i l e ’ ) ;
23
24 var dump ( f i l e e x i s t s ( ’ / tmp / example . t x t ’ ) ) ;
25 ?>
26 −−EXPECT−−
27 bool ( true )
Testen State of the Art 13 / 40
31. File Uploads with PHPT
1 −−TEST−−
2 Example t e s t e m u l a t i n g a f i l e upload
3 −−POST RAW−−
4 Content −Type : m u l t i p a r t / form − data ; boundary=−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
5
6 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
7 Content − D i s p o s i t i o n : form − data ; name= ” f i l e ” ; f i l e n a m e = ” example . t x t ”
8 Content −Type : t e x t / p l a i n
9
10 Qafoo p r o v i d e s q u a l i t y assurance s u p p o r t and c o n s u l t i n g
11
12 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
13 Content − D i s p o s i t i o n : form − data ; name= ” submit ”
14
15 Upload
16 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn −−
17 −−FILE −−
18 <?php
19 require DIR . ’ / UploadExample . php ’ ;
20
21 $upload = new UploadExample ( ’ / tmp ’ ) ;
22 $upload −> handle ( ’ f i l e ’ ) ;
23
24 var dump ( f i l e e x i s t s ( ’ / tmp / example . t x t ’ ) ) ;
25 ?>
26 −−EXPECT−−
27 bool ( true )
Testen State of the Art 13 / 40
32. File Uploads with PHPT
1 −−TEST−−
2 Example t e s t e m u l a t i n g a f i l e upload
3 −−POST RAW−−
4 Content −Type : m u l t i p a r t / form − data ; boundary=−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
5
6 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
7 Content − D i s p o s i t i o n : form − data ; name= ” f i l e ” ; f i l e n a m e = ” example . t x t ”
8 Content −Type : t e x t / p l a i n
9
10 Qafoo p r o v i d e s q u a l i t y assurance s u p p o r t and c o n s u l t i n g
11
12 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
13 Content − D i s p o s i t i o n : form − data ; name= ” submit ”
14
15 Upload
16 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn −−
17 −−FILE −−
18 <?php
19 require DIR . ’ / UploadExample . php ’ ;
20
21 $upload = new UploadExample ( ’ / tmp ’ ) ;
22 $upload −> handle ( ’ f i l e ’ ) ;
23
24 var dump ( f i l e e x i s t s ( ’ / tmp / example . t x t ’ ) ) ;
25 ?>
26 −−EXPECT−−
27 bool ( true )
Testen State of the Art 13 / 40
33. File Uploads with PHPT
1 −−TEST−−
2 Example t e s t e m u l a t i n g a f i l e upload
3 −−POST RAW−−
4 Content −Type : m u l t i p a r t / form − data ; boundary=−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
5
6 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
7 Content − D i s p o s i t i o n : form − data ; name= ” f i l e ” ; f i l e n a m e = ” example . t x t ”
8 Content −Type : t e x t / p l a i n
9
10 Qafoo p r o v i d e s q u a l i t y assurance s u p p o r t and c o n s u l t i n g
11
12 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn
13 Content − D i s p o s i t i o n : form − data ; name= ” submit ”
14
15 Upload
16 −−−−−−WebKitFormBoundaryfywL8UCjFtqUBTQn −−
17 −−FILE −−
18 <?php
19 require DIR . ’ / UploadExample . php ’ ;
20
21 $upload = new UploadExample ( ’ / tmp ’ ) ;
22 $upload −> handle ( ’ f i l e ’ ) ;
23
24 var dump ( f i l e e x i s t s ( ’ / tmp / example . t x t ’ ) ) ;
25 ?>
26 −−EXPECT−−
27 bool ( true )
Testen State of the Art 13 / 40
34. PHPT within PHPUnit
1 <ph punit >
2 <testsuites >
3 < t e s t s u i t e name= ”PHPT” >
4 < d i r e c t o r y s u f f i x = ” . phpt ” > . / < / d i r e c t o r y >
5 </ t e s t s u i t e >
6 </ t e s t s u i t e s >
7 </ p h p u n i t >
Testen State of the Art 14 / 40
35. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 15 / 40
36. Behavior Driven Development
Behavior Driven Development (BDD)
Deeper coupling between
Business Analysis
Quality Assurance
Basic ideas:
Use cases as requirements
Make use cases executable
Verify functionality
Advantages:
Communication
Documentation
Short Human readable tests
Testen State of the Art 16 / 40
37. Behavior Driven Development
Behavior Driven Development (BDD)
Deeper coupling between
Business Analysis
Quality Assurance
Basic ideas:
Use cases as requirements
Make use cases executable
Verify functionality
Advantages:
Communication
Documentation
Short Human readable tests
Testen State of the Art 16 / 40
38. Behavior Driven Development
Behavior Driven Development (BDD)
Deeper coupling between
Business Analysis
Quality Assurance
Basic ideas:
Use cases as requirements
Make use cases executable
Verify functionality
Advantages:
Communication
Documentation
Short Human readable tests
Testen State of the Art 16 / 40
39. Behavior Driven Development
Behavior Driven Development (BDD)
Deeper coupling between
Business Analysis
Quality Assurance
Basic ideas:
Use cases as requirements
Make use cases executable
Verify functionality
Advantages:
Communication
Documentation
Short Human readable tests
Testen State of the Art 16 / 40
40. The BDD process
1. Define a Domain Specific Language (DSL)
2. Describe Use Cases
3. Implement against Use Case execution
Testen State of the Art 17 / 40
41. Behat
BDD framework for PHP
http://behat.org/
Inspired by Ruby’s Cucumber
Getting started:
http://docs.behat.org/quick_intro.html
Testen State of the Art 18 / 40
42. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
43. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
44. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
45. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
46. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
47. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
48. Defining Features
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 19 / 40
49. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
50. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
51. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
52. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
53. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
54. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
48 /∗ ∗
49 ∗ @Given / ˆ I have a s e c t i o n w i t h name ” ( [ ˆ ” ] + ) ” and i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
50 ∗/
51 public function i H a v e A S e c t i o n W i t h N a m e A n d I d e n t i f i e r ( $name , $ i d e n t i f i e r )
52 {
53 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
54
55 $sectionCreate = $ s e c t i o n S e r v i c e −> n e w S e c t i o n C r e a t e S t r u c t ( ) ;
56 $ s e c t i o n C r e a t e −>name = $name ;
57 $ s e c t i o n C r e a t e −> i d e n t i f i e r = $ i d e n t i f i e r ;
58
59 $ t h i s −> runtimeData [ $ i d e n t i f i e r ] = $ s e c t i o n S e r v i c e −> c r e a t e S e c t i o n ( $ s e c t i o n C r e a t e
);
60 }
112 }
Testen State of the Art 20 / 40
55. When . . .
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 21 / 40
56. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
69 /∗ ∗
70 ∗ @When / ˆ I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
71 ∗/
72 public function i D e l e t e S e c t i o n W i t h I d e n t i f i e r ( $ i d e n t i f i e r )
73 {
74 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
75
76 try
77 {
78 $ s e c t i o n = $ s e c t i o n S e r v i c e −> l o a d S e c t i o n B y I d e n t i f i e r ( $ i d e n t i f i e r ) ;
79 $ s e c t i o n S e r v i c e −> d e l e t e S e c t i o n ( $ s e c t i o n ) ;
80 }
81 catch ( E x c e p t io n $e )
82 {
83 $ t h i s −> runtimeData [ ’ e x c e p t i o n ’ ] = $e ;
84 }
85 }
112 }
Testen State of the Art 22 / 40
57. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
69 /∗ ∗
70 ∗ @When / ˆ I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” ( [ ˆ ” ] + ) ” $ /
71 ∗/
72 public function i D e l e t e S e c t i o n W i t h I d e n t i f i e r ( $ i d e n t i f i e r )
73 {
74 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
75
76 try
77 {
78 $ s e c t i o n = $ s e c t i o n S e r v i c e −> l o a d S e c t i o n B y I d e n t i f i e r ( $ i d e n t i f i e r ) ;
79 $ s e c t i o n S e r v i c e −> d e l e t e S e c t i o n ( $ s e c t i o n ) ;
80 }
81 catch ( E x c e p t io n $e )
82 {
83 $ t h i s −> runtimeData [ ’ e x c e p t i o n ’ ] = $e ;
84 }
85 }
112 }
Testen State of the Art 22 / 40
58. Then . . .
1 Feature :
2 BDD t e s t s f o r t h e eZ P u b l i s h S e c t i o n API
3
4 Scenario : Admin user can d e l e t e a s e c t i o n
5 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
6 And I am logged i n as user ” admin ”
7 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
8 Then I expect no s e c t i o n f o r i d e n t i f i e r ” MySectionKey ” e x i s t s
9
10 Scenario : Anonymous user cannot d e l e t e a s e c t i o n
11 Given I have a s e c t i o n w i t h name ” MySection ” and i d e n t i f i e r ” MySectionKey ”
12 And I am logged i n as user ” anonymous ”
13 When I d e l e t e s e c t i o n w i t h i d e n t i f i e r ” MySectionKey ”
14 Then I expect d e l e t e f a i l e s w i t h an e x c e p t i o n o f t y p e ” u n a u t h o r i z e d ”
Testen State of the Art 23 / 40
59. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
87 /∗ ∗
88 ∗ @Then / ˆ I expect no s e c t i o n f o r i d e n t i f i e r ” ( [ ˆ ” ] + ) ” e x i s t s $ /
89 ∗/
90 public function i E x p e c t N o S e c t i o n F o r I d e n t i f i e r E x i s t s ( $ i d e n t i f i e r )
91 {
92 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
93 try
94 {
95 $ s e c t i o n S e r v i c e −> l o a d S e c t i o n B y I d e n t i f i e r ( $ i d e n t i f i e r ) ;
96 throw new RuntimeException ( ” I d e n t i f i e r { $ i d e n t i f i e r } s t i l l exists . ” ) ;
97 }
98 catch ( eZ P u b l i s h API R e p o s i t o r y E x c ep t i o ns NotFoundException $e )
99 {
100 }
101 }
112 }
Testen State of the Art 24 / 40
60. Implementing the DSL
16 class F ea tu re Co nt ex t extends BehatContext
17 {
87 /∗ ∗
88 ∗ @Then / ˆ I expect no s e c t i o n f o r i d e n t i f i e r ” ( [ ˆ ” ] + ) ” e x i s t s $ /
89 ∗/
90 public function i E x p e c t N o S e c t i o n F o r I d e n t i f i e r E x i s t s ( $ i d e n t i f i e r )
91 {
92 $ s e c t i o n S e r v i c e = $ t h i s −> r e p o s i t o r y −> g e t S e c t i o n S e r v i c e ( ) ;
93 try
94 {
95 $ s e c t i o n S e r v i c e −> l o a d S e c t i o n B y I d e n t i f i e r ( $ i d e n t i f i e r ) ;
96 throw new RuntimeException ( ” I d e n t i f i e r { $ i d e n t i f i e r } s t i l l exists . ” ) ;
97 }
98 catch ( eZ P u b l i s h API R e p o s i t o r y E x c ep t i o ns NotFoundException $e )
99 {
100 }
101 }
112 }
Testen State of the Art 24 / 40
61. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 25 / 40
62. Automated Acceptance Tests
High level system tests
Assert user expectations
Good start for refactoring
Approaches
HTTP spider (e.g. Goutte)
Browser controller (e.g. Selenium, Sahi)
Browser emulator (e.g. Zombie.js)
Testen State of the Art 26 / 40
63. Mink
Acceptance Test Framework
http://mink.behat.org
Abstraction for underlying tools
Full integration into Behat
Testen State of the Art 27 / 40
64. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
65. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
66. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
67. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
68. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
69. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
70. Testing a Registration Form
1 Feature : R e g i s t r a t i o n
2 I n o r d e r t o perform a c t i o n s l i k e an o r d e r
3 As a normal user
4 I must perform a r e g i s t r a t i o n
5
6 Scenario : Test a d e f a u l t r e g i s t r a t i o n
7 Given I am on ” / r e g i s t e r ”
8 When I s e l e c t ” p r i v a t e ” from ” r e g i s t e r p e r s o n a l c u s t o m e r t y p e ”
9 And I s e l e c t ” mr ” from ” r e g i s t e r p e r s o n a l s a l u t a t i o n m r ”
10 And I f i l l i n ” f i r s t n a m e ” w i t h ” Tobias ”
11 And I f i l l i n ” lastname ” w i t h ” S c h l i t t ”
12 And I f i l l i n ” r e g i s t e r p e r s o n a l e m a i l ” w i t h ” ts01@qafoo . com ”
13 And I f i l l in ” register personal password ” with ” sindelfingen ”
14 And I f i l l in ” register personal passwordConfirmation ” with ” sindelfingen ”
15 And I f i l l i n ” phone ” w i t h ”+49 ( 0 ) 209 40501252”
16 And I f i l l i n ” s t r e e t ” w i t h ” Bochumer S t r a s s e ”
17 And I f i l l i n ” s t re e tn u mb e r ” w i t h ” 2 2 6 ”
18 And I f i l l i n ” zipcode ” w i t h ”45886”
19 And I f i l l i n ” c i t y ” w i t h ” G el s en k ir c he n ”
20 And I s e l e c t ” 2 ” from ” c o u n t r y ”
21 And I press ” r e g i s t e r b u t t o n ”
22 Then I should see ” Willkommen , Tobias S c h l i t t ”
Testen State of the Art 28 / 40
71. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 29 / 40
72. Testing JavaScript
You test PHP . . .
. . . do you test JavaScript?
Testen State of the Art 30 / 40
73. js-test-driver
Test runner for JavaScript
https://code.google.com/p/js-test-driver/
Test JS inside browsers
Run JS tests from command line
No HTML required
Testen State of the Art 31 / 40
74. Simple JS Code
1 var H e l l o = function ( ) { } ;
2 Hello . prototype = {
3 say : function ( who ) {
4 i f ( who === u n d e fi n e d ) {
5 who = ” World ” ;
6 }
7 r e t u r n ” H e l l o ” + who + ” ! ” ;
8 }
9 }
Testen State of the Art 32 / 40
75. Simple JS Code
1 var H e l l o = function ( ) { } ;
2 Hello . prototype = {
3 say : function ( who ) {
4 i f ( who === u n d e fi n e d ) {
5 who = ” World ” ;
6 }
7 r e t u r n ” H e l l o ” + who + ” ! ” ;
8 }
9 }
Testen State of the Art 32 / 40
76. Simple JS Code
1 var H e l l o = function ( ) { } ;
2 Hello . prototype = {
3 say : function ( who ) {
4 i f ( who === u n d e fi n e d ) {
5 who = ” World ” ;
6 }
7 r e t u r n ” H e l l o ” + who + ” ! ” ;
8 }
9 }
Testen State of the Art 32 / 40
77. Simple JS Code
1 var H e l l o = function ( ) { } ;
2 Hello . prototype = {
3 say : function ( who ) {
4 i f ( who === u n d e fi n e d ) {
5 who = ” World ” ;
6 }
7 r e t u r n ” H e l l o ” + who + ” ! ” ;
8 }
9 }
Testen State of the Art 32 / 40
78. A Simple Test Case
1 TestCase ( ” H e l l o o b j e c t t e s t s ” , {
2 ” setUp ” : function ( ) {
3 t h i s . h e l l o = new H e l l o ( ) ;
4 },
5 ” t e s t C a l l a b l e W i t h o u t A r g u m e n t ” : function ( ) {
6 a s s e r t E q u a l s ( ” H e l l o World ! ” , t h i s . h e l l o . say ( ) ) ;
7 },
8 ” t e s t C a l l a b l e W i t h A r g u m e n t ” : function ( ) {
9 a s s e r t E q u a l s ( ” H e l l o Jakob ! ” , t h i s . h e l l o . say ( ” Jakob ” ) ) ;
10 }
11 }) ;
Testen State of the Art 33 / 40
79. A Simple Test Case
1 TestCase ( ” H e l l o o b j e c t t e s t s ” , {
2 ” setUp ” : function ( ) {
3 t h i s . h e l l o = new H e l l o ( ) ;
4 },
5 ” t e s t C a l l a b l e W i t h o u t A r g u m e n t ” : function ( ) {
6 a s s e r t E q u a l s ( ” H e l l o World ! ” , t h i s . h e l l o . say ( ) ) ;
7 },
8 ” t e s t C a l l a b l e W i t h A r g u m e n t ” : function ( ) {
9 a s s e r t E q u a l s ( ” H e l l o Jakob ! ” , t h i s . h e l l o . say ( ” Jakob ” ) ) ;
10 }
11 }) ;
Testen State of the Art 33 / 40
80. A Simple Test Case
1 TestCase ( ” H e l l o o b j e c t t e s t s ” , {
2 ” setUp ” : function ( ) {
3 t h i s . h e l l o = new H e l l o ( ) ;
4 },
5 ” t e s t C a l l a b l e W i t h o u t A r g u m e n t ” : function ( ) {
6 a s s e r t E q u a l s ( ” H e l l o World ! ” , t h i s . h e l l o . say ( ) ) ;
7 },
8 ” t e s t C a l l a b l e W i t h A r g u m e n t ” : function ( ) {
9 a s s e r t E q u a l s ( ” H e l l o Jakob ! ” , t h i s . h e l l o . say ( ” Jakob ” ) ) ;
10 }
11 }) ;
Testen State of the Art 33 / 40
81. A Simple Test Case
1 TestCase ( ” H e l l o o b j e c t t e s t s ” , {
2 ” setUp ” : function ( ) {
3 t h i s . h e l l o = new H e l l o ( ) ;
4 },
5 ” t e s t C a l l a b l e W i t h o u t A r g u m e n t ” : function ( ) {
6 a s s e r t E q u a l s ( ” H e l l o World ! ” , t h i s . h e l l o . say ( ) ) ;
7 },
8 ” t e s t C a l l a b l e W i t h A r g u m e n t ” : function ( ) {
9 a s s e r t E q u a l s ( ” H e l l o Jakob ! ” , t h i s . h e l l o . say ( ” Jakob ” ) ) ;
10 }
11 }) ;
Testen State of the Art 33 / 40
82. Configuring js-test-driver
1 s e r v e r : h t t p : / / l o c a l h o s t :4223
2
3 load :
4 − src / hello . j s
5 − tests / hello . js
Testen State of the Art 34 / 40
83. Configuring js-test-driver
1 s e r v e r : h t t p : / / l o c a l h o s t :4223
2
3 load :
4 − src / hello . j s
5 − tests / hello . js
Testen State of the Art 34 / 40
84. Running the Tests
First shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− p o r t 4223
Capture browser
http://localhost:4223/capture
Second shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− t e s t s a l l
2 s e t t i n g runnermode QUIET
3 ....
4 T o t a l 4 t e s t s ( Passed : 4 ; F a i l s : 0 ; E r r o r s : 0 ) ( 1 . 0 0 ms)
5 F i r e f o x 12.0 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 1 . 0 0 ms)
6 Chrome 18 .0 .1 025 .1 68 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 0 . 0 0 ms)
Testen State of the Art 35 / 40
85. Running the Tests
First shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− p o r t 4223
Capture browser
http://localhost:4223/capture
Second shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− t e s t s a l l
2 s e t t i n g runnermode QUIET
3 ....
4 T o t a l 4 t e s t s ( Passed : 4 ; F a i l s : 0 ; E r r o r s : 0 ) ( 1 . 0 0 ms)
5 F i r e f o x 12.0 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 1 . 0 0 ms)
6 Chrome 1 8 .0 .1 025 .1 68 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 0 . 0 0 ms)
Testen State of the Art 35 / 40
86. Running the Tests
First shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− p o r t 4223
Capture browser
http://localhost:4223/capture
Second shell
1 $ j a v a − j a r J s T e s t D r i v e r − 1 . 3 . 4 . b . j a r −− t e s t s a l l
2 s e t t i n g runnermode QUIET
3 ....
4 T o t a l 4 t e s t s ( Passed : 4 ; F a i l s : 0 ; E r r o r s : 0 ) ( 1 . 0 0 ms)
5 F i r e f o x 12.0 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 1 . 0 0 ms)
6 Chrome 18 .0 .1 025 .1 68 L i n u x : Run 2 t e s t s ( Passed : 2 ; F a i l s : 0 ; E r r o r s 0 ) ( 0 . 0 0 ms)
Testen State of the Art 35 / 40
87. More on JS Testing
JavaScript QA: js-test-driver und Sinon.JS richtig nutzen
Jakob Westhoff (Qafoo)
Wednesday, 14:00, Salon 2
Testen State of the Art 36 / 40
88. Outline
Unit Testing
Testing File Uploads
Behavior Driven Development
Automated Acceptance Tests
Testing JavaScript
Outlook
Testen State of the Art 37 / 40
89. Unified Build Process
https://github.com/manuelpichler/build-commons
Framework for build scripts
Unified targets, like
test
package
verify
deploy
39 supported tool extensions
PHPUnit, CodeSniffer, PDepend, PHPMD, PHPCPD, . . .
DB, DBDeploy, PHAR, Pirum, . . .
js-test-driver, JSLint, JSHint, . . .
...
Testen State of the Art 38 / 40
90. Unified Build Process
https://github.com/manuelpichler/build-commons
Framework for build scripts
Unified targets, like
test
package
verify
deploy
39 supported tool extensions
PHPUnit, CodeSniffer, PDepend, PHPMD, PHPCPD, . . .
DB, DBDeploy, PHAR, Pirum, . . .
js-test-driver, JSLint, JSHint, . . .
...
Testen State of the Art 38 / 40
91. Unified Build Process
https://github.com/manuelpichler/build-commons
Framework for build scripts
Unified targets, like
test
package
verify
deploy
39 supported tool extensions
PHPUnit, CodeSniffer, PDepend, PHPMD, PHPCPD, . . .
DB, DBDeploy, PHAR, Pirum, . . .
js-test-driver, JSLint, JSHint, . . .
...
Testen State of the Art 38 / 40
92. Continuous Performance
Does your app still perform?
Find performance regressions
Ensure optimizations persist
Apache JMeter
https://jmeter.apache.org/
Complex user paths
Concurrend requests
Record on proxy
Clustering
Integrate into Continuous Integration
Immer am Optimum, Continuous Performance
Wednesday, 16:15, Salon 2
Kore Nordmann, Manuel Pichler
Testen State of the Art 39 / 40
93. Continuous Performance
Does your app still perform?
Find performance regressions
Ensure optimizations persist
Apache JMeter
https://jmeter.apache.org/
Complex user paths
Concurrend requests
Record on proxy
Clustering
Integrate into Continuous Integration
Immer am Optimum, Continuous Performance
Wednesday, 16:15, Salon 2
Kore Nordmann, Manuel Pichler
Testen State of the Art 39 / 40
94. Continuous Performance
Does your app still perform?
Find performance regressions
Ensure optimizations persist
Apache JMeter
https://jmeter.apache.org/
Complex user paths
Concurrend requests
Record on proxy
Clustering
Integrate into Continuous Integration
Immer am Optimum, Continuous Performance
Wednesday, 16:15, Salon 2
Kore Nordmann, Manuel Pichler
Testen State of the Art 39 / 40
95. Continuous Performance
Does your app still perform?
Find performance regressions
Ensure optimizations persist
Apache JMeter
https://jmeter.apache.org/
Complex user paths
Concurrend requests
Record on proxy
Clustering
Integrate into Continuous Integration
Immer am Optimum, Continuous Performance
Wednesday, 16:15, Salon 2
Kore Nordmann, Manuel Pichler
Testen State of the Art 39 / 40
96. Thanks for Listening
Please rate this talk at
https://joind.in/event/IPC2012
(Slides: http://talks.qafoo.com)
Stay in touch
Manuel Pichler Tobias Schlitt
manuel@qafoo.com toby@qafoo.com
@manuelp / @qafoo @tobySen / @qafoo
Rent a PHP quality expert:
http://qafoo.com
Testen State of the Art 40 / 40
97. Thanks for Listening
Please rate this talk at
https://joind.in/event/IPC2012
(Slides: http://talks.qafoo.com)
Stay in touch
Manuel Pichler Tobias Schlitt
manuel@qafoo.com toby@qafoo.com
@manuelp / @qafoo @tobySen / @qafoo
Rent a PHP quality expert:
http://qafoo.com
Testen State of the Art 40 / 40
98. Thanks for Listening
Please rate this talk at
https://joind.in/event/IPC2012
(Slides: http://talks.qafoo.com)
Stay in touch
Manuel Pichler Tobias Schlitt
manuel@qafoo.com toby@qafoo.com
@manuelp / @qafoo @tobySen / @qafoo
Rent a PHP quality expert:
http://qafoo.com
Testen State of the Art 40 / 40