SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
0Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
Functional tests with TYPO3
» Introduction
» How to start
» Running functional tests
1Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
INTRODUCTION
„What is (functional) testing about?“
» test a part of your software
» not about testing your functions or classes, but processes
» from a user's point of view
» for quality assurance (QA)
„Why do I need functional tests?“
» Unit Tests don't ensure a correct workflow
» manual tests take a lot of time
» encapsulated system (database) without site-effects or dependencies
2Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„First you need a test case!“
<?php
namespace IchHabRechtExampleExtensionTestsFunctional;
class FirstFunctionalTest extends TYPO3CMSCoreTestsFunctionalTestCase {
}
3Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Ensure your extension is loaded!“
/**
* @var array
*/
protected $testExtensionsToLoad = array(
'typo3conf/ext/example_extension',
'typo3conf/ext/example_extension/Tests/Functional/Fixtures/Extensions/test_extension',
);
/**
* @var array
*/
protected $coreExtensionsToLoad = array(
'workspaces',
);
4Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Add additional files!“
/**
* @var array
*/
protected $pathsToLinkInTestInstance = array(
'typo3conf/ext/example_extension/Tests/Functional/Fixtures/AdditionalConfiguration.php' =>
'typo3conf/AdditionalConfiguration.php',
);
5Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Overwrite LocalConfiguration settings!“
/**
* @var array
*/
protected $configurationToUseInTestInstance = array(
'BE' => array(
'debug' => TRUE,
),
'FE' => array(
'debug' => TRUE,
),
);
6Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Initialize your infrastructure!“
protected function setUp() {
parent::setUp();
}
 test folder in typo3temp is created
 core is linked into test folder
 test extensions are linked into typo3conf/ext
 paths and files are linked
 LocalConfiguration.php is written
 PackageStates.php is written
 bootstrap is initialized
 database is created
 database scheme is imported
7Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„If you need a backend user!“
protected function setUp() {
parent::setUp();
$this->setUpBackendUserFromFixture(1); // Import and log-in a default backend user
}
8Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Import your data set!“
protected function setUp() {
parent::setUp();
$this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/pages.xml');
// Import own fixtures
$fixturePath = ORIGINAL_ROOT . 'typo3conf/ext/example_extension/Tests/Functional/Fixtures';
$this->importDataSet($fixturePath . 'pages.xml'); // Import database records from the xml file
}
Fixtures, shipped by the core:
 be_users.xml
 pages.xml
 pages_language_overlay.xml
 sys_file_storage.xml
 sys_language.xml
 tt_content.xml
9Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Import your data set!“
typo3/sysext/core/Tests/Functional/Fixtures/pages.xml
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<pages>
<uid>1</uid>
<pid>0</pid>
<title>Root</title>
<deleted>0</deleted>
<perms_everybody>15</perms_everybody>
</pages>
<pages>
<uid>2</uid>
<pid>1</pid>
<title>Dummy 1-2</title>
<deleted>0</deleted>
<perms_everybody>15</perms_everybody>
</pages>
…
</dataset>
10Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
protected function setUp() {
parent::setUp();
$this->setUpFrontendRootPage(
1, // page id
array( // array of TypoScript files which should be included
'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts'
)
);
}
11Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts
config {
…
}
page = PAGE
page {
…
}
[globalVar = GP:L = 1]
config.sys_language_uid = 1
[end]
12Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – config.watcher
 Defines tables and fields which should be collected to be returned
config.watcher {
tableFields {
pages = uid,_ORIG_uid,pid,sorting,title
sys_category = uid,_ORIG_uid,_LOCALIZED_UID,pid,sys_language_uid,title,parent,items,sys_language_uid
sys_file = uid,_ORIG_uid,_LOCALIZED_UID,pid,title,sys_language_uid
sys_file_reference = uid,_ORIG_uid,_LOCALIZED_UID,title,description,alternative,link,downloadname,
missing,identifier,file,pid,sys_language_uid,title,parent,items,sys_language_uid,uid_local,
uid_foreign,tablenames,fieldname,table_local
tt_content = uid,_ORIG_uid,_LOCALIZED_UID,pid,sorting,sys_language_uid,header,categories
}
}
13Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page
page = PAGE
page {
10 = COA
10 {
 Store current page in register
1 = LOAD_REGISTER
1.watcher.dataWrap = pages:{field:uid} // pages:1
 Add current page data to records and structure array
2 = USER
2.userFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->addRecordData
14Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – lib.watcherDataObject
lib.watcherDataObject = COA
lib.watcherDataObject {
1 = LOAD_REGISTER
1.watcher.dataWrap = |
2 = USER
2.userFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->addRecordData
99 = RESTORE_REGISTER
}
15Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page.10
 Get page sub tree
10 = CONTENT
10 {
stdWrap.required = 1
table = pages
select {
orderBy = sorting
pidInList = this
# prevent sys_language_uid lookup
languageField = 0
}
renderObj < lib.watcherDataObject
renderObj.1.watcher.dataWrap = {register:watcher}|.__pages/pages:{field:uid} // pages:1.__pages/pages:2
}
16Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page.10
 Get content records
20 = CONTENT
20 {
table = tt_content
select {
orderBy = sorting
where = colPos=0
}
renderObj < lib.watcherDataObject
renderObj.1.watcher.dataWrap = {register:watcher}|.__contents/tt_content:{field:uid} // pages:1.__contents/tt_content:1
17Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page.10.20
 get additional information (sys_category, sys_file_reference)
renderObj.10 = CONTENT
if.isTrue.field = categories
table = sys_category
select {
pidInList = root,-1
selectFields = sys_category.*
join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid
where.data = field:_ORIG_uid // field:uid
where.intval = 1
where.wrap = sys_category_record_mm.uid_foreign=|
orderBy = sys_category_record_mm.sorting_foreign
languageField = sys_category.sys_language_uid
}
renderObj < lib.watcherDataObject
renderObj.1.watcher.dataWrap = {register:watcher}|.categories/sys_category:{field:uid}
// pages:1.__contents/tt_content:1.categories/sys_category:1
18Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page.10
 store collected data for output in a section “Default”
stdWrap.postUserFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->attachSection
stdWrap.postUserFunc.as = Default
19Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Set up the frontend!“
JsonRenderer.ts – page
 return collected sections as json
stdWrap.postUserFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendRenderer->renderSections
20Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
HOW TO START
„Write your test!“
/**
* @test
*/
public function contentIsShown() {
$expectedRecords = array(
…,
);
$response = $this->getFrontendResponse(
1, // page id
0, // language id
0, // backend user id
0, // workspace id
TRUE, // fail on failure
0 // frontend user id
);
$responseContent = json_decode($response->getContent() , TRUE);
$this->assertEquals($expectedRecords, $responseContent['Default']['records']);
$this->assertInRecords($expectedRecords[0], $responseContent['Default']['records']);
}
21Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
RUNNING FUNCTIONAL TESTS
„What you need!“
 global PHP >= 5.5.0
 composer installation of PHPUnit
{
"require-dev": {
"phpunit/phpunit": “~4.7.0",
"mikey179/vfsStream": “1.4.*@dev“
}
}
 TYPO3 core source
22Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
RUNNING FUNCTIONAL TESTS
„FINALLY RUN!“
 go to your TYPO3 root directory
bin/phpunit -c typo3/sysext/core/Build/FunctionalTests.xml typo3conf/ext/example_extension/Tests/Functional
 use TYPO3 source (or change the used database)
typo3DatabaseName="yourDatabase" typo3DatabaseUsername="yourUser" 
typo3DatabasePassword="yourPassword" typo3DatabaseHost="localhost" 
TYPO3_PATH_WEB=“/path/to/typo3_root” 
bin/phpunit -c /path/to/typo3_root/typo3/sysext/core/Build/FunctionalTests.xml 
/path/to/typo3_root/typo3conf/ext/example_extension/Tests/Functional
23Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
RUNNING FUNCTIONAL TESTS
„PARTY!“
24Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz
Thank you
for your attention!

Mais conteúdo relacionado

Mais procurados

Proximate analysis of Fonterra
Proximate analysis of Fonterra Proximate analysis of Fonterra
Proximate analysis of Fonterra Jessica Woods
 
Özel Öğretici Yazılımlar - DotnetNuke
Özel Öğretici Yazılımlar - DotnetNukeÖzel Öğretici Yazılımlar - DotnetNuke
Özel Öğretici Yazılımlar - DotnetNukeMustafa Çakmak
 
nota roti dan roll (1)
nota roti dan roll (1)nota roti dan roll (1)
nota roti dan roll (1)NURSAFIA3
 
Processing food by thermal application (2)
Processing food by thermal application (2)Processing food by thermal application (2)
Processing food by thermal application (2)EnodioTagalogonAriel
 
Pathological changes in pem
Pathological  changes in pemPathological  changes in pem
Pathological changes in pemShaan Ahmed
 
Low Purine Diet For Gout
Low Purine Diet For GoutLow Purine Diet For Gout
Low Purine Diet For GoutCureGout
 
parenteral nutrition
parenteral nutritionparenteral nutrition
parenteral nutritionSumer Yadav
 

Mais procurados (7)

Proximate analysis of Fonterra
Proximate analysis of Fonterra Proximate analysis of Fonterra
Proximate analysis of Fonterra
 
Özel Öğretici Yazılımlar - DotnetNuke
Özel Öğretici Yazılımlar - DotnetNukeÖzel Öğretici Yazılımlar - DotnetNuke
Özel Öğretici Yazılımlar - DotnetNuke
 
nota roti dan roll (1)
nota roti dan roll (1)nota roti dan roll (1)
nota roti dan roll (1)
 
Processing food by thermal application (2)
Processing food by thermal application (2)Processing food by thermal application (2)
Processing food by thermal application (2)
 
Pathological changes in pem
Pathological  changes in pemPathological  changes in pem
Pathological changes in pem
 
Low Purine Diet For Gout
Low Purine Diet For GoutLow Purine Diet For Gout
Low Purine Diet For Gout
 
parenteral nutrition
parenteral nutritionparenteral nutrition
parenteral nutrition
 

Destaque

Fluid Security
Fluid SecurityFluid Security
Fluid Securitycpsitgmbh
 
Unit tests for dummies
Unit tests for dummiesUnit tests for dummies
Unit tests for dummiescpsitgmbh
 
Functional tests for dummies
Functional tests for dummiesFunctional tests for dummies
Functional tests for dummiescpsitgmbh
 
TYPO3 Caching
TYPO3 CachingTYPO3 Caching
TYPO3 Cachingcpsitgmbh
 
TYPO3 Contribution Bootup Day
TYPO3 Contribution Bootup DayTYPO3 Contribution Bootup Day
TYPO3 Contribution Bootup Daycpsitgmbh
 
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
SymfonyCon Berlin 2016 Jenkins Deployment PipelinesSymfonyCon Berlin 2016 Jenkins Deployment Pipelines
SymfonyCon Berlin 2016 Jenkins Deployment Pipelinescpsitgmbh
 
Präsentation zu EXT:form by TRITUM
Präsentation zu EXT:form by TRITUMPräsentation zu EXT:form by TRITUM
Präsentation zu EXT:form by TRITUMTRITUM
 

Destaque (8)

Fluid Security
Fluid SecurityFluid Security
Fluid Security
 
Unit tests for dummies
Unit tests for dummiesUnit tests for dummies
Unit tests for dummies
 
Functional tests for dummies
Functional tests for dummiesFunctional tests for dummies
Functional tests for dummies
 
Hooks
HooksHooks
Hooks
 
TYPO3 Caching
TYPO3 CachingTYPO3 Caching
TYPO3 Caching
 
TYPO3 Contribution Bootup Day
TYPO3 Contribution Bootup DayTYPO3 Contribution Bootup Day
TYPO3 Contribution Bootup Day
 
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
SymfonyCon Berlin 2016 Jenkins Deployment PipelinesSymfonyCon Berlin 2016 Jenkins Deployment Pipelines
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
 
Präsentation zu EXT:form by TRITUM
Präsentation zu EXT:form by TRITUMPräsentation zu EXT:form by TRITUM
Präsentation zu EXT:form by TRITUM
 

Semelhante a Functional tests with TYPO3

How to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringHow to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringJose María Arranz
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSTechWell
 
How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF Luc Bors
 
Apollo ecosystem
Apollo ecosystemApollo ecosystem
Apollo ecosystemJames Akwuh
 
Introduction to SQLite in Adobe AIR
Introduction to SQLite in Adobe AIRIntroduction to SQLite in Adobe AIR
Introduction to SQLite in Adobe AIRPeter Elst
 
Sql storeprocedure
Sql storeprocedureSql storeprocedure
Sql storeprocedureftz 420
 
Lewis Chiu Portfolio
Lewis Chiu PortfolioLewis Chiu Portfolio
Lewis Chiu PortfolioLewisChiu
 
Practical Google App Engine Applications In Py
Practical Google App Engine Applications In PyPractical Google App Engine Applications In Py
Practical Google App Engine Applications In PyEric ShangKuan
 
Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Stamatis Zampetakis
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programmingchhaichivon
 
Best Practices with ODI : Flexibility
Best Practices with ODI : FlexibilityBest Practices with ODI : Flexibility
Best Practices with ODI : FlexibilityGurcan Orhan
 
Does Your IBM i Security Meet the Bar for GDPR?
Does Your IBM i Security Meet the Bar for GDPR?Does Your IBM i Security Meet the Bar for GDPR?
Does Your IBM i Security Meet the Bar for GDPR?Precisely
 
Jdbc oracle
Jdbc oracleJdbc oracle
Jdbc oracleyazidds2
 

Semelhante a Functional tests with TYPO3 (20)

How to configure with Spring an api not based on Spring
How to configure with Spring an api not based on SpringHow to configure with Spring an api not based on Spring
How to configure with Spring an api not based on Spring
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
 
SQLite with UWP
SQLite with UWPSQLite with UWP
SQLite with UWP
 
Library Project
Library ProjectLibrary Project
Library Project
 
Chapter 3 stored procedures
Chapter 3 stored proceduresChapter 3 stored procedures
Chapter 3 stored procedures
 
How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF How to Bring Common UI Patterns to ADF
How to Bring Common UI Patterns to ADF
 
Apollo ecosystem
Apollo ecosystemApollo ecosystem
Apollo ecosystem
 
Introduction to SQLite in Adobe AIR
Introduction to SQLite in Adobe AIRIntroduction to SQLite in Adobe AIR
Introduction to SQLite in Adobe AIR
 
How te bring common UI patterns to ADF
How te bring common UI patterns to ADFHow te bring common UI patterns to ADF
How te bring common UI patterns to ADF
 
Sql storeprocedure
Sql storeprocedureSql storeprocedure
Sql storeprocedure
 
Lewis Chiu Portfolio
Lewis Chiu PortfolioLewis Chiu Portfolio
Lewis Chiu Portfolio
 
Practical Google App Engine Applications In Py
Practical Google App Engine Applications In PyPractical Google App Engine Applications In Py
Practical Google App Engine Applications In Py
 
Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programming
 
Best Practices with ODI : Flexibility
Best Practices with ODI : FlexibilityBest Practices with ODI : Flexibility
Best Practices with ODI : Flexibility
 
Triggers and Stored Procedures
Triggers and Stored ProceduresTriggers and Stored Procedures
Triggers and Stored Procedures
 
Does Your IBM i Security Meet the Bar for GDPR?
Does Your IBM i Security Meet the Bar for GDPR?Does Your IBM i Security Meet the Bar for GDPR?
Does Your IBM i Security Meet the Bar for GDPR?
 
Google cloud Dataflow & Apache Flink
Google cloud Dataflow & Apache FlinkGoogle cloud Dataflow & Apache Flink
Google cloud Dataflow & Apache Flink
 
Jdbc oracle
Jdbc oracleJdbc oracle
Jdbc oracle
 
Struts2 - 101
Struts2 - 101Struts2 - 101
Struts2 - 101
 

Último

LESSON 10/ GROUP 10/ ST. THOMAS AQUINASS
LESSON 10/ GROUP 10/ ST. THOMAS AQUINASSLESSON 10/ GROUP 10/ ST. THOMAS AQUINASS
LESSON 10/ GROUP 10/ ST. THOMAS AQUINASSlesteraporado16
 
Presentation2.pptx - JoyPress Wordpress
Presentation2.pptx -  JoyPress WordpressPresentation2.pptx -  JoyPress Wordpress
Presentation2.pptx - JoyPress Wordpressssuser166378
 
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...APNIC
 
Bio Medical Waste Management Guideliness 2023 ppt.pptx
Bio Medical Waste Management Guideliness 2023 ppt.pptxBio Medical Waste Management Guideliness 2023 ppt.pptx
Bio Medical Waste Management Guideliness 2023 ppt.pptxnaveenithkrishnan
 
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024Jan Löffler
 
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDS
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDSTYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDS
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDSedrianrheine
 
Check out the Free Landing Page Hosting in 2024
Check out the Free Landing Page Hosting in 2024Check out the Free Landing Page Hosting in 2024
Check out the Free Landing Page Hosting in 2024Shubham Pant
 
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced Horizons
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced HorizonsVision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced Horizons
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced HorizonsRoxana Stingu
 
Zero-day Vulnerabilities
Zero-day VulnerabilitiesZero-day Vulnerabilities
Zero-day Vulnerabilitiesalihassaah1994
 
Introduction to ICANN and Fellowship program by Shreedeep Rayamajhi.pdf
Introduction to ICANN and Fellowship program  by Shreedeep Rayamajhi.pdfIntroduction to ICANN and Fellowship program  by Shreedeep Rayamajhi.pdf
Introduction to ICANN and Fellowship program by Shreedeep Rayamajhi.pdfShreedeep Rayamajhi
 
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdf
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdfLESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdf
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdfmchristianalwyn
 
Computer 10 Lesson 8: Building a Website
Computer 10 Lesson 8: Building a WebsiteComputer 10 Lesson 8: Building a Website
Computer 10 Lesson 8: Building a WebsiteMavein
 

Último (12)

LESSON 10/ GROUP 10/ ST. THOMAS AQUINASS
LESSON 10/ GROUP 10/ ST. THOMAS AQUINASSLESSON 10/ GROUP 10/ ST. THOMAS AQUINASS
LESSON 10/ GROUP 10/ ST. THOMAS AQUINASS
 
Presentation2.pptx - JoyPress Wordpress
Presentation2.pptx -  JoyPress WordpressPresentation2.pptx -  JoyPress Wordpress
Presentation2.pptx - JoyPress Wordpress
 
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
Benefits of doing Internet peering and running an Internet Exchange (IX) pres...
 
Bio Medical Waste Management Guideliness 2023 ppt.pptx
Bio Medical Waste Management Guideliness 2023 ppt.pptxBio Medical Waste Management Guideliness 2023 ppt.pptx
Bio Medical Waste Management Guideliness 2023 ppt.pptx
 
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
 
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDS
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDSTYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDS
TYPES AND DEFINITION OF ONLINE CRIMES AND HAZARDS
 
Check out the Free Landing Page Hosting in 2024
Check out the Free Landing Page Hosting in 2024Check out the Free Landing Page Hosting in 2024
Check out the Free Landing Page Hosting in 2024
 
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced Horizons
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced HorizonsVision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced Horizons
Vision Forward: Tracing Image Search SEO From Its Roots To AI-Enhanced Horizons
 
Zero-day Vulnerabilities
Zero-day VulnerabilitiesZero-day Vulnerabilities
Zero-day Vulnerabilities
 
Introduction to ICANN and Fellowship program by Shreedeep Rayamajhi.pdf
Introduction to ICANN and Fellowship program  by Shreedeep Rayamajhi.pdfIntroduction to ICANN and Fellowship program  by Shreedeep Rayamajhi.pdf
Introduction to ICANN and Fellowship program by Shreedeep Rayamajhi.pdf
 
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdf
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdfLESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdf
LESSON 5 GROUP 10 ST. THOMAS AQUINAS.pdf
 
Computer 10 Lesson 8: Building a Website
Computer 10 Lesson 8: Building a WebsiteComputer 10 Lesson 8: Building a Website
Computer 10 Lesson 8: Building a Website
 

Functional tests with TYPO3

  • 1. 0Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz Functional tests with TYPO3 » Introduction » How to start » Running functional tests
  • 2. 1Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz INTRODUCTION „What is (functional) testing about?“ » test a part of your software » not about testing your functions or classes, but processes » from a user's point of view » for quality assurance (QA) „Why do I need functional tests?“ » Unit Tests don't ensure a correct workflow » manual tests take a lot of time » encapsulated system (database) without site-effects or dependencies
  • 3. 2Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „First you need a test case!“ <?php namespace IchHabRechtExampleExtensionTestsFunctional; class FirstFunctionalTest extends TYPO3CMSCoreTestsFunctionalTestCase { }
  • 4. 3Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Ensure your extension is loaded!“ /** * @var array */ protected $testExtensionsToLoad = array( 'typo3conf/ext/example_extension', 'typo3conf/ext/example_extension/Tests/Functional/Fixtures/Extensions/test_extension', ); /** * @var array */ protected $coreExtensionsToLoad = array( 'workspaces', );
  • 5. 4Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Add additional files!“ /** * @var array */ protected $pathsToLinkInTestInstance = array( 'typo3conf/ext/example_extension/Tests/Functional/Fixtures/AdditionalConfiguration.php' => 'typo3conf/AdditionalConfiguration.php', );
  • 6. 5Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Overwrite LocalConfiguration settings!“ /** * @var array */ protected $configurationToUseInTestInstance = array( 'BE' => array( 'debug' => TRUE, ), 'FE' => array( 'debug' => TRUE, ), );
  • 7. 6Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Initialize your infrastructure!“ protected function setUp() { parent::setUp(); }  test folder in typo3temp is created  core is linked into test folder  test extensions are linked into typo3conf/ext  paths and files are linked  LocalConfiguration.php is written  PackageStates.php is written  bootstrap is initialized  database is created  database scheme is imported
  • 8. 7Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „If you need a backend user!“ protected function setUp() { parent::setUp(); $this->setUpBackendUserFromFixture(1); // Import and log-in a default backend user }
  • 9. 8Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Import your data set!“ protected function setUp() { parent::setUp(); $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/pages.xml'); // Import own fixtures $fixturePath = ORIGINAL_ROOT . 'typo3conf/ext/example_extension/Tests/Functional/Fixtures'; $this->importDataSet($fixturePath . 'pages.xml'); // Import database records from the xml file } Fixtures, shipped by the core:  be_users.xml  pages.xml  pages_language_overlay.xml  sys_file_storage.xml  sys_language.xml  tt_content.xml
  • 10. 9Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Import your data set!“ typo3/sysext/core/Tests/Functional/Fixtures/pages.xml <?xml version="1.0" encoding="utf-8"?> <dataset> <pages> <uid>1</uid> <pid>0</pid> <title>Root</title> <deleted>0</deleted> <perms_everybody>15</perms_everybody> </pages> <pages> <uid>2</uid> <pid>1</pid> <title>Dummy 1-2</title> <deleted>0</deleted> <perms_everybody>15</perms_everybody> </pages> … </dataset>
  • 11. 10Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ protected function setUp() { parent::setUp(); $this->setUpFrontendRootPage( 1, // page id array( // array of TypoScript files which should be included 'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.ts' ) ); }
  • 12. 11Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts config { … } page = PAGE page { … } [globalVar = GP:L = 1] config.sys_language_uid = 1 [end]
  • 13. 12Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – config.watcher  Defines tables and fields which should be collected to be returned config.watcher { tableFields { pages = uid,_ORIG_uid,pid,sorting,title sys_category = uid,_ORIG_uid,_LOCALIZED_UID,pid,sys_language_uid,title,parent,items,sys_language_uid sys_file = uid,_ORIG_uid,_LOCALIZED_UID,pid,title,sys_language_uid sys_file_reference = uid,_ORIG_uid,_LOCALIZED_UID,title,description,alternative,link,downloadname, missing,identifier,file,pid,sys_language_uid,title,parent,items,sys_language_uid,uid_local, uid_foreign,tablenames,fieldname,table_local tt_content = uid,_ORIG_uid,_LOCALIZED_UID,pid,sorting,sys_language_uid,header,categories } }
  • 14. 13Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page page = PAGE page { 10 = COA 10 {  Store current page in register 1 = LOAD_REGISTER 1.watcher.dataWrap = pages:{field:uid} // pages:1  Add current page data to records and structure array 2 = USER 2.userFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->addRecordData
  • 15. 14Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – lib.watcherDataObject lib.watcherDataObject = COA lib.watcherDataObject { 1 = LOAD_REGISTER 1.watcher.dataWrap = | 2 = USER 2.userFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->addRecordData 99 = RESTORE_REGISTER }
  • 16. 15Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page.10  Get page sub tree 10 = CONTENT 10 { stdWrap.required = 1 table = pages select { orderBy = sorting pidInList = this # prevent sys_language_uid lookup languageField = 0 } renderObj < lib.watcherDataObject renderObj.1.watcher.dataWrap = {register:watcher}|.__pages/pages:{field:uid} // pages:1.__pages/pages:2 }
  • 17. 16Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page.10  Get content records 20 = CONTENT 20 { table = tt_content select { orderBy = sorting where = colPos=0 } renderObj < lib.watcherDataObject renderObj.1.watcher.dataWrap = {register:watcher}|.__contents/tt_content:{field:uid} // pages:1.__contents/tt_content:1
  • 18. 17Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page.10.20  get additional information (sys_category, sys_file_reference) renderObj.10 = CONTENT if.isTrue.field = categories table = sys_category select { pidInList = root,-1 selectFields = sys_category.* join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid where.data = field:_ORIG_uid // field:uid where.intval = 1 where.wrap = sys_category_record_mm.uid_foreign=| orderBy = sys_category_record_mm.sorting_foreign languageField = sys_category.sys_language_uid } renderObj < lib.watcherDataObject renderObj.1.watcher.dataWrap = {register:watcher}|.categories/sys_category:{field:uid} // pages:1.__contents/tt_content:1.categories/sys_category:1
  • 19. 18Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page.10  store collected data for output in a section “Default” stdWrap.postUserFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendCollector->attachSection stdWrap.postUserFunc.as = Default
  • 20. 19Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Set up the frontend!“ JsonRenderer.ts – page  return collected sections as json stdWrap.postUserFunc = TYPO3CMSCoreTestsFunctionalFrameworkFrontendRenderer->renderSections
  • 21. 20Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz HOW TO START „Write your test!“ /** * @test */ public function contentIsShown() { $expectedRecords = array( …, ); $response = $this->getFrontendResponse( 1, // page id 0, // language id 0, // backend user id 0, // workspace id TRUE, // fail on failure 0 // frontend user id ); $responseContent = json_decode($response->getContent() , TRUE); $this->assertEquals($expectedRecords, $responseContent['Default']['records']); $this->assertInRecords($expectedRecords[0], $responseContent['Default']['records']); }
  • 22. 21Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz RUNNING FUNCTIONAL TESTS „What you need!“  global PHP >= 5.5.0  composer installation of PHPUnit { "require-dev": { "phpunit/phpunit": “~4.7.0", "mikey179/vfsStream": “1.4.*@dev“ } }  TYPO3 core source
  • 23. 22Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz RUNNING FUNCTIONAL TESTS „FINALLY RUN!“  go to your TYPO3 root directory bin/phpunit -c typo3/sysext/core/Build/FunctionalTests.xml typo3conf/ext/example_extension/Tests/Functional  use TYPO3 source (or change the used database) typo3DatabaseName="yourDatabase" typo3DatabaseUsername="yourUser" typo3DatabasePassword="yourPassword" typo3DatabaseHost="localhost" TYPO3_PATH_WEB=“/path/to/typo3_root” bin/phpunit -c /path/to/typo3_root/typo3/sysext/core/Build/FunctionalTests.xml /path/to/typo3_root/typo3conf/ext/example_extension/Tests/Functional
  • 24. 23Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz RUNNING FUNCTIONAL TESTS „PARTY!“
  • 25. 24Nicole Cordes, T3DD15, CPS-IT Mehr Wert im Netz Thank you for your attention!