SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Magento 2
integration tests
What is Magento?
One of the most popular Ecommerce platforms
All the stuff that one web shop needs
Used on 1.3% of all websites (http://w3techs.com/technologies/overview/content_management/all)
Based on PHP, MySQL….
Free and paid versions
Modular approach (Catalog, Category, Checkout, Sales…)
Magento grew over years
Huge number of extensions
Huge number of features
Huge community
Magento 2
Announced 2010
Refactor / rewrite
Goals:
Modern tech stack
Improved performance and scalability
Streamline customizations
Simplify external integrations
Easier installation and upgrades
High code quality and testing
More info: http://alankent.me/2014/05/17/magento-2-goals/
Magento 2 introduces
Namespaces
Composer
Jquery instead of Prototype
Dependency injection
Service contracts
Plugins
XML Schema validation
Automated tests
Automated testing vs manual testing
Executed more quickly
Reusable
Everyone can see results
Costs less
More reliable
More interesting
More info: http://www.base36.com/2013/03/automated-vs-manual-testing-the-pros-and-cons-of-each/
Automated tests in Magento 2
Unit tests
Integration tests
Functional tests
Other tests (performance, legacy...):
More info: http://alankent.me/2014/06/28/magento-2-test-automation/
Integration tests
“Integration tests show that the major parts of a system work
well together”
- The Pragmatic Programmer Book
The official Magento automated testing standard
Integration tests:
Deployed on close to real environment.
Integration tests verify interaction of components between each other and with system
environment (database, file system).
The goals are to tackle cross-dependencies between components/modules and environment-
related issues.
Integration test can also be considered as a "small" functional test, so its goal to preserve
functionality
More info: https://github.com/magento/magento2/wiki/Magento-Automated-Testing-Standard
Difference from unit tests
Unit tests test the smallest units of code, integration tests test how those units
work together
Integration tests touch more code
Integration tests have less mocking and less isolation
Unit tests are faster
Unit tests are easier to debug
Difference from functional tests
Functional tests compare against the specification
Functional tests are slower
Functional tests can tell us if something visible to the customer broke
Integration tests in Magento 2
Based on PHPUnit
Can touch the database and filesystem
Have separate database
Separated into modules
Magento core code is tested with integration tests
Make updates easier
From my experience most of the common mistakes would be picked up by
integration tests
Setup
bin/magento dev:test:run integration
cd dev/tests/integration && phpunit -c phpunit.xml
Separate database: dev/tests/integration/etc/install-config-mysql.php.dist
Configuration in dev/tests/integration/phpunit.xml.dist
TESTS_CLEANUP
TESTS_MAGENTO_MODE
TESTS_ERROR_LOG_LISTENER_LEVEL
Annotations
/**
* Test something
*
* @magentoConfigFixture currency/options/allow USD
* @magentoAppIsolation enabled
* @magentoDbIsolation enabled
*/
public function testSomething()
{
}
Annotations
/**
* Test something
*
* @magentoConfigFixture currency/options/allow USD
* @magentoAppIsolation enabled
* @magentoDbIsolation enabled
*/
public function testSomething()
{
}
What are annotations
Meta data used to inject some behaviour
Placed in docblocks
Change test behaviour
PHPUnit_Framework_TestListener
onTestStart, onTestSuccess, onTestFailure, etc
More info: http://dusanlukic.com/annotations-in-magento-2-integration-tests
@magentoDbIsolation
when enabled wraps the test in a transaction
enabled - makes sure that the tests don’t affect each other
disabled - useful for debugging as data remains in database
can be applied on class level and on method level
@magentoConfigFixture
Sets the config value
/**
* @magentoConfigFixture current_store sales_email/order/attachagreement 1
*/
@magentoDataFixture
/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php
$product = MagentoTestFrameworkHelperBootstrap::getObjectManager()
->create('MagentoCatalogModelProduct');
$product->setTypeId('simple')
->setAttributeSetId(4)
->setWebsiteIds([1])
->setName('Simple Product')
->setSku('simple')
->setPrice(10)
->setMetaTitle('meta title')
->setMetaKeyword('meta keyword')
->setMetaDescription('meta description')
->setVisibility(MagentoCatalogModelProductVisibility::VISIBILITY_BOTH)
->setStatus(MagentoCatalogModelProductAttributeSourceStatus::STATUS_ENABLED)
->setStockData(['use_config_manage_stock' => 0])
->setSpecialPrice('5.99')
->save();
Rollback script
/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price_rollback.php
$product = MagentoTestFrameworkHelperBootstrap::getObjectManager()
->create('MagentoCatalogModelProduct');
$product->load(1);
if ($product->getId()) {
$product->delete();
}
Some examples
Integration tests can do much more
Don’t test Magento framework, test your own code
Test that that non existing category goes to 404
class CategoryTest extends
MagentoTestFrameworkTestCaseAbstractController
{
/*...*/
public function testViewActionInactiveCategory()
{
$this->dispatch('catalog/category/view/id/8');
$this->assert404NotFound();
}
/*...*/
}
Save and load entity
$obj = MagentoTestFrameworkHelperBootstrap::getObjectManager()
->get('LDusanSampleModelExampleFactory')
->create();
$obj->setVar('value');
$obj->save();
$id = $something->getId();
$repo = MagentoTestFrameworkHelperBootstrap::getObjectManager()
->get('LDusanSampleApiExampleRepositoryInterface');
$example = $repo->getById($id);
$this->assertSame($example->getVar(), 'value');
Real life example, Fooman_EmailAttachments
Most of the stores have terms and agreement
An email is sent to the customer after each successful order
Goal: Provide the option of attaching terms and agreement to order
success email
Send an email and check contents
/**
* @magentoDataFixture Magento/Sales/_files/order.php
* @magentoDataFixture Magento/CheckoutAgreements/_files/agreement_active_with_html_content.php
* @magentoConfigFixture current_store sales_email/order/attachagreement 1
*/
public function testWithHtmlTermsAttachment()
{
$orderSender = $this->objectManager->create('MagentoSalesModelOrderEmailSenderOrderSender');
$orderSender->send($order);
$termsAttachment = $this->getAttachmentOfType($this->getLastEmail(), 'text/html; charset=UTF-8');
$this->assertContains('Checkout agreement content', base64_decode($termsAttachment['Body']));
}
public function getLastEmail()
{
$this->mailhogClient->setUri(self::BASE_URL . 'v2/messages?limit=1');
$lastEmail = json_decode($this->mailhogClient->request()->getBody(), true);
$lastEmailId = $lastEmail['items'][0]['ID'];
$this->mailhogClient->resetParameters(true);
$this->mailhogClient->setUri(self::BASE_URL . 'v1/messages/' . $lastEmailId);
return json_decode($this->mailhogClient->request()->getBody(), true);
}
The View
Layout
Block
Template
Goal: Insert a block into catalog product view page
Block
/app/code/LDusan/Sample/Block/Sample.php
<?php
namespace LDusanSampleBlock;
class Sample extends MagentoFrameworkViewElementTemplate
{
}
Layout
/app/code/LDusan/Sample/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<body>
<referenceContainer name="content">
<block class="LDusanSampleBlockSample" name="ldusan-sample-block"
template="LDusan_Sample::sample.phtml" />
</referenceContainer>
</body>
</page>
Template
/app/code/LDusan/Sample/view/frontend/templates/sample.phtml
<p>This should appear in catalog product view page!</p>
Test if block is added correctly
<?php
namespace LDusanSampleController;
class ActionTest extends MagentoTestFrameworkTestCaseAbstractController
{
/**
* @magentoDataFixture Magento/Catalog/_files/product_special_price.php
*/
public function testBlockAdded()
{
$this->dispatch('catalog/product/view/id/' . $product->getId());
$layout = MagentoTestFrameworkHelperBootstrap::getObjectManager()->get(
'MagentoFrameworkViewLayoutInterface'
);
$this->assertArrayHasKey('ldusan-sample-block', $layout->getAllBlocks());
}
}
To summarize
Integration tests are not:
The only tests that you should write
Integration tests are:
A way to check if something really works as expected
Proof that our code works well with the environment
Thanks!
Slides on Twitter: @LDusan
Questions?

Contenu connexe

Tendances

UFT Automation Framework Introduction
UFT Automation Framework IntroductionUFT Automation Framework Introduction
UFT Automation Framework Introduction
Himal Bandara
 
Automation Framework/QTP Framework
Automation Framework/QTP FrameworkAutomation Framework/QTP Framework
Automation Framework/QTP Framework
HeyDay Software Solutions
 
Automation framework
Automation framework Automation framework
Automation framework
ITeLearn
 
Keyword Driven Testing
Keyword Driven TestingKeyword Driven Testing
Keyword Driven Testing
Maveryx
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in Silverlight
Devnology
 

Tendances (18)

DaKiRY_BAQ2016_QADay_Marta Firlej "Microsoft Test Manager tool – how can we u...
DaKiRY_BAQ2016_QADay_Marta Firlej "Microsoft Test Manager tool – how can we u...DaKiRY_BAQ2016_QADay_Marta Firlej "Microsoft Test Manager tool – how can we u...
DaKiRY_BAQ2016_QADay_Marta Firlej "Microsoft Test Manager tool – how can we u...
 
Acceptance testing in php with Codeception - Techmeetup Edinburgh
Acceptance testing in php with Codeception - Techmeetup EdinburghAcceptance testing in php with Codeception - Techmeetup Edinburgh
Acceptance testing in php with Codeception - Techmeetup Edinburgh
 
Keyword-driven Test Automation Framework
Keyword-driven Test Automation FrameworkKeyword-driven Test Automation Framework
Keyword-driven Test Automation Framework
 
Rft courseware
Rft coursewareRft courseware
Rft courseware
 
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFTRFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
 
TESTLINK INTEGRATOR
TESTLINK INTEGRATORTESTLINK INTEGRATOR
TESTLINK INTEGRATOR
 
Codeception: introduction to php testing
Codeception: introduction to php testingCodeception: introduction to php testing
Codeception: introduction to php testing
 
Keyword Driven Automation
Keyword Driven AutomationKeyword Driven Automation
Keyword Driven Automation
 
UFT Automation Framework Introduction
UFT Automation Framework IntroductionUFT Automation Framework Introduction
UFT Automation Framework Introduction
 
Automation Framework/QTP Framework
Automation Framework/QTP FrameworkAutomation Framework/QTP Framework
Automation Framework/QTP Framework
 
Automation framework
Automation framework Automation framework
Automation framework
 
Test Tooling in Visual Studio 2012 an overview
Test Tooling in Visual Studio 2012 an overviewTest Tooling in Visual Studio 2012 an overview
Test Tooling in Visual Studio 2012 an overview
 
Keyword Driven Testing
Keyword Driven TestingKeyword Driven Testing
Keyword Driven Testing
 
Unit testing and MVVM in Silverlight
Unit testing and MVVM in SilverlightUnit testing and MVVM in Silverlight
Unit testing and MVVM in Silverlight
 
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
 
Coded UI: Hand Coding based on Page Object Model
Coded UI: Hand Coding based on Page Object ModelCoded UI: Hand Coding based on Page Object Model
Coded UI: Hand Coding based on Page Object Model
 
Codeception
CodeceptionCodeception
Codeception
 
Codeception introduction and use in Yii
Codeception introduction and use in YiiCodeception introduction and use in Yii
Codeception introduction and use in Yii
 

En vedette

Dissertation_FULL-DRAFT-Revised
Dissertation_FULL-DRAFT-RevisedDissertation_FULL-DRAFT-Revised
Dissertation_FULL-DRAFT-Revised
Franklin Allaire
 
940000_Gas Daily_Storage Regulations
940000_Gas Daily_Storage Regulations940000_Gas Daily_Storage Regulations
940000_Gas Daily_Storage Regulations
Paul Bieniawski
 
Content marketing tips & tricks
Content marketing tips & tricksContent marketing tips & tricks
Content marketing tips & tricks
Yael Kochman
 
Lowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost ManagementLowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost Management
Giuseppe Mele
 

En vedette (20)

Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)Getting your hands dirty testing Magento 2 (at MageTitansIT)
Getting your hands dirty testing Magento 2 (at MageTitansIT)
 
Dissertation_FULL-DRAFT-Revised
Dissertation_FULL-DRAFT-RevisedDissertation_FULL-DRAFT-Revised
Dissertation_FULL-DRAFT-Revised
 
How to Turn Content Into Revenue
How to Turn Content Into RevenueHow to Turn Content Into Revenue
How to Turn Content Into Revenue
 
Final 9 7-13
Final 9 7-13Final 9 7-13
Final 9 7-13
 
Human face-of-accessibility
Human face-of-accessibilityHuman face-of-accessibility
Human face-of-accessibility
 
940000_Gas Daily_Storage Regulations
940000_Gas Daily_Storage Regulations940000_Gas Daily_Storage Regulations
940000_Gas Daily_Storage Regulations
 
Wcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejamesWcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejames
 
Cic rds product portfolio october 2013
Cic rds product portfolio   october 2013Cic rds product portfolio   october 2013
Cic rds product portfolio october 2013
 
Imp drishti farm to fork club
Imp drishti farm to fork clubImp drishti farm to fork club
Imp drishti farm to fork club
 
Content marketing tips & tricks
Content marketing tips & tricksContent marketing tips & tricks
Content marketing tips & tricks
 
Dbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farmingDbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farming
 
Client case study - GHS
Client case study   - GHSClient case study   - GHS
Client case study - GHS
 
Service profile scsg mining
Service profile scsg miningService profile scsg mining
Service profile scsg mining
 
Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010
 
Openployer company info
Openployer company infoOpenployer company info
Openployer company info
 
PostGIS on Rails
PostGIS on RailsPostGIS on Rails
PostGIS on Rails
 
Skills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibilitySkills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibility
 
QA Accessibility-testing
QA Accessibility-testingQA Accessibility-testing
QA Accessibility-testing
 
Lowendalmasaï social charges optimization
Lowendalmasaï social charges optimizationLowendalmasaï social charges optimization
Lowendalmasaï social charges optimization
 
Lowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost ManagementLowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost Management
 

Similaire à Magento 2 integration tests

Zepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_FinalZepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_Final
Max Pronko
 

Similaire à Magento 2 integration tests (20)

Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
 
Introduction to Integration Tests in Magento / Adobe Commerce
Introduction to Integration Tests in Magento / Adobe CommerceIntroduction to Integration Tests in Magento / Adobe Commerce
Introduction to Integration Tests in Magento / Adobe Commerce
 
Introduction to Integration Tests in Magento / Adobe Commerce
Introduction to Integration Tests in Magento / Adobe CommerceIntroduction to Integration Tests in Magento / Adobe Commerce
Introduction to Integration Tests in Magento / Adobe Commerce
 
Zepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_FinalZepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_Final
 
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-AppsSelenium-Browser-Based-Automated-Testing-for-Grails-Apps
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
 
Magento++
Magento++Magento++
Magento++
 
Mastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium SuccessfullyMastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium Successfully
 
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
 
Qa process
Qa processQa process
Qa process
 
Code igniter unittest-part1
Code igniter unittest-part1Code igniter unittest-part1
Code igniter unittest-part1
 
Qa process
Qa processQa process
Qa process
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
 
Selenium-Webdriver With PHPUnit Automation test for Joomla CMS!
Selenium-Webdriver With PHPUnit Automation test for Joomla CMS!Selenium-Webdriver With PHPUnit Automation test for Joomla CMS!
Selenium-Webdriver With PHPUnit Automation test for Joomla CMS!
 
Katalon Studio - GUI Overview
Katalon Studio - GUI OverviewKatalon Studio - GUI Overview
Katalon Studio - GUI Overview
 
Unit Testing in Flutter - From Workflow Essentials to Complex Scenarios
Unit Testing in Flutter - From Workflow Essentials to Complex ScenariosUnit Testing in Flutter - From Workflow Essentials to Complex Scenarios
Unit Testing in Flutter - From Workflow Essentials to Complex Scenarios
 
Introduction to the Magento eCommerce Platform
Introduction to the Magento eCommerce PlatformIntroduction to the Magento eCommerce Platform
Introduction to the Magento eCommerce Platform
 
Introduction to Mangento
Introduction to Mangento Introduction to Mangento
Introduction to Mangento
 
Mangento
MangentoMangento
Mangento
 
Magento Integration Tests
Magento Integration TestsMagento Integration Tests
Magento Integration Tests
 

Dernier

Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 

Dernier (20)

tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 

Magento 2 integration tests

  • 2. What is Magento? One of the most popular Ecommerce platforms All the stuff that one web shop needs Used on 1.3% of all websites (http://w3techs.com/technologies/overview/content_management/all) Based on PHP, MySQL…. Free and paid versions Modular approach (Catalog, Category, Checkout, Sales…)
  • 3. Magento grew over years Huge number of extensions Huge number of features Huge community
  • 4. Magento 2 Announced 2010 Refactor / rewrite Goals: Modern tech stack Improved performance and scalability Streamline customizations Simplify external integrations Easier installation and upgrades High code quality and testing More info: http://alankent.me/2014/05/17/magento-2-goals/
  • 5. Magento 2 introduces Namespaces Composer Jquery instead of Prototype Dependency injection Service contracts Plugins XML Schema validation Automated tests
  • 6. Automated testing vs manual testing Executed more quickly Reusable Everyone can see results Costs less More reliable More interesting More info: http://www.base36.com/2013/03/automated-vs-manual-testing-the-pros-and-cons-of-each/
  • 7. Automated tests in Magento 2 Unit tests Integration tests Functional tests Other tests (performance, legacy...): More info: http://alankent.me/2014/06/28/magento-2-test-automation/
  • 9. “Integration tests show that the major parts of a system work well together” - The Pragmatic Programmer Book
  • 10. The official Magento automated testing standard Integration tests: Deployed on close to real environment. Integration tests verify interaction of components between each other and with system environment (database, file system). The goals are to tackle cross-dependencies between components/modules and environment- related issues. Integration test can also be considered as a "small" functional test, so its goal to preserve functionality More info: https://github.com/magento/magento2/wiki/Magento-Automated-Testing-Standard
  • 11. Difference from unit tests Unit tests test the smallest units of code, integration tests test how those units work together Integration tests touch more code Integration tests have less mocking and less isolation Unit tests are faster Unit tests are easier to debug
  • 12. Difference from functional tests Functional tests compare against the specification Functional tests are slower Functional tests can tell us if something visible to the customer broke
  • 13. Integration tests in Magento 2 Based on PHPUnit Can touch the database and filesystem Have separate database Separated into modules Magento core code is tested with integration tests Make updates easier From my experience most of the common mistakes would be picked up by integration tests
  • 14. Setup bin/magento dev:test:run integration cd dev/tests/integration && phpunit -c phpunit.xml Separate database: dev/tests/integration/etc/install-config-mysql.php.dist Configuration in dev/tests/integration/phpunit.xml.dist TESTS_CLEANUP TESTS_MAGENTO_MODE TESTS_ERROR_LOG_LISTENER_LEVEL
  • 15. Annotations /** * Test something * * @magentoConfigFixture currency/options/allow USD * @magentoAppIsolation enabled * @magentoDbIsolation enabled */ public function testSomething() { }
  • 16. Annotations /** * Test something * * @magentoConfigFixture currency/options/allow USD * @magentoAppIsolation enabled * @magentoDbIsolation enabled */ public function testSomething() { }
  • 17. What are annotations Meta data used to inject some behaviour Placed in docblocks Change test behaviour PHPUnit_Framework_TestListener onTestStart, onTestSuccess, onTestFailure, etc More info: http://dusanlukic.com/annotations-in-magento-2-integration-tests
  • 18. @magentoDbIsolation when enabled wraps the test in a transaction enabled - makes sure that the tests don’t affect each other disabled - useful for debugging as data remains in database can be applied on class level and on method level
  • 19. @magentoConfigFixture Sets the config value /** * @magentoConfigFixture current_store sales_email/order/attachagreement 1 */
  • 20. @magentoDataFixture /dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php $product = MagentoTestFrameworkHelperBootstrap::getObjectManager() ->create('MagentoCatalogModelProduct'); $product->setTypeId('simple') ->setAttributeSetId(4) ->setWebsiteIds([1]) ->setName('Simple Product') ->setSku('simple') ->setPrice(10) ->setMetaTitle('meta title') ->setMetaKeyword('meta keyword') ->setMetaDescription('meta description') ->setVisibility(MagentoCatalogModelProductVisibility::VISIBILITY_BOTH) ->setStatus(MagentoCatalogModelProductAttributeSourceStatus::STATUS_ENABLED) ->setStockData(['use_config_manage_stock' => 0]) ->setSpecialPrice('5.99') ->save();
  • 21. Rollback script /dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price_rollback.php $product = MagentoTestFrameworkHelperBootstrap::getObjectManager() ->create('MagentoCatalogModelProduct'); $product->load(1); if ($product->getId()) { $product->delete(); }
  • 22. Some examples Integration tests can do much more Don’t test Magento framework, test your own code
  • 23. Test that that non existing category goes to 404 class CategoryTest extends MagentoTestFrameworkTestCaseAbstractController { /*...*/ public function testViewActionInactiveCategory() { $this->dispatch('catalog/category/view/id/8'); $this->assert404NotFound(); } /*...*/ }
  • 24. Save and load entity $obj = MagentoTestFrameworkHelperBootstrap::getObjectManager() ->get('LDusanSampleModelExampleFactory') ->create(); $obj->setVar('value'); $obj->save(); $id = $something->getId(); $repo = MagentoTestFrameworkHelperBootstrap::getObjectManager() ->get('LDusanSampleApiExampleRepositoryInterface'); $example = $repo->getById($id); $this->assertSame($example->getVar(), 'value');
  • 25. Real life example, Fooman_EmailAttachments Most of the stores have terms and agreement An email is sent to the customer after each successful order Goal: Provide the option of attaching terms and agreement to order success email
  • 26. Send an email and check contents /** * @magentoDataFixture Magento/Sales/_files/order.php * @magentoDataFixture Magento/CheckoutAgreements/_files/agreement_active_with_html_content.php * @magentoConfigFixture current_store sales_email/order/attachagreement 1 */ public function testWithHtmlTermsAttachment() { $orderSender = $this->objectManager->create('MagentoSalesModelOrderEmailSenderOrderSender'); $orderSender->send($order); $termsAttachment = $this->getAttachmentOfType($this->getLastEmail(), 'text/html; charset=UTF-8'); $this->assertContains('Checkout agreement content', base64_decode($termsAttachment['Body'])); } public function getLastEmail() { $this->mailhogClient->setUri(self::BASE_URL . 'v2/messages?limit=1'); $lastEmail = json_decode($this->mailhogClient->request()->getBody(), true); $lastEmailId = $lastEmail['items'][0]['ID']; $this->mailhogClient->resetParameters(true); $this->mailhogClient->setUri(self::BASE_URL . 'v1/messages/' . $lastEmailId); return json_decode($this->mailhogClient->request()->getBody(), true); }
  • 27. The View Layout Block Template Goal: Insert a block into catalog product view page
  • 31. Test if block is added correctly <?php namespace LDusanSampleController; class ActionTest extends MagentoTestFrameworkTestCaseAbstractController { /** * @magentoDataFixture Magento/Catalog/_files/product_special_price.php */ public function testBlockAdded() { $this->dispatch('catalog/product/view/id/' . $product->getId()); $layout = MagentoTestFrameworkHelperBootstrap::getObjectManager()->get( 'MagentoFrameworkViewLayoutInterface' ); $this->assertArrayHasKey('ldusan-sample-block', $layout->getAllBlocks()); } }
  • 32. To summarize Integration tests are not: The only tests that you should write Integration tests are: A way to check if something really works as expected Proof that our code works well with the environment
  • 33. Thanks! Slides on Twitter: @LDusan Questions?