SlideShare a Scribd company logo
AUTOMATED
TESTING IN DRUPAL
8
• @jaypan on Drupal.org and drupal.stackexchange.com
• Acquia certified Drupal Grandmaster
• Acquia Certified Developer
• Acquia Certified Developer – Front end specialist
• Acquia Certified Developer – Back end specialist
• Living in Japan since 2000
• Working with Drupal since 2007
• Currently writing a book on coding in Drupal
JAY FRIENDLY
JAY FRIENDLY
• Owner of Jaypan in Yokohama
• English https://www.jaypan.com
• Japanese https://www.jaypan.jp
• Jaypan specializes in
• high-performance AJAX/JavaScript heavy applications
• Custom module/theme development
• App Development
• Drupal integration with outside technologies
• JavaScript libraries
• Linux programs
• Multiple Drupal instances
• Technical consulting and translation (Japanese/English)
OVERVIEW
• Manual testing vs. automated testing
• How do automated tests work?
• History of testing in Drupal
• Types of automated tests in Drupal
• Discussion of each type of test
MANUAL TESTING
• Developer creates new functionality
• Developer tests new functionality
• Other people (client, team-members) test new functionality
• Found bugs are fixed
PROBLEMS WITH MANUAL TESTING
• Complex functionality requires significant time to test
• Easy to forget to test a given scenario
• Changes to code require re-testing every scenario after any change
• Changes to code in other parts of the system may break functionality
without anyone realizing it
• As time passes, the conditions that need to be tested may be
forgotten or lost as project members change
• Coming back to code after a period of time means the developer is
not sure what is required
AUTOMATED TESTING
• Developer creates automated tests that run through all testing
scenarios
• Testing system runs all tests and reports any behaviors that are
unexpected (aka bugs)
BENEFITS OF AUTOMATED TESTING
• Removes requirement of getting humans to test after each code
change
• Tests are faster than human testing
• Tests for the whole system can be run before committing any code to
a production server, to ensure new functionality in one part of the
system hasn’t broken functionality in another part of the system.
• If (or rather, when) new bugs are found, tests can be added along
with the fix, to ensure that the bug never arises again
• Overall system is more stable.
PROBLEMS WITH AUTOMATED TESTING
• Writing tests takes a significant amount of time
• Extra time means extra development resources
• Clients cannot directly see tests, and may not understand the extra costs
in developing when there is nothing for them to look at.
• Tests only test what they have been written to test. If the developer does
not think to test something, a bug could exist. The existence of automated
tests in such a case may create a false sense of security
• Tests happen in a virtual (non-visible) environment, making them hard to
debug (and even create)
• Changing code often requires re-writing old tests
OR IN OTHER WORDS, WHAT IS IT?
HOW DOES A TEST WORK?
• A test will first run some code, then do ‘assertions’ to ensure that the results work as
expected.
• For example, in Drupal 8, nodes have a method id(), that returns the ID of the
node.
• An automated test would create a new node object, then run $node->id() and test:
• Was a result returned?
• Is the result an integer?
• Is the returned ID the expected (correct) ID of the node that was created?
• Any failed assertions result in a failed test, telling the developer exactly what failed,
so they know what to fix.
AUTOMATED TESTING IN DRUPAL - HISTORY
• Drupal 6 - Simpletest module
• Drupal 7 - Simpletest in core
• Drupal 8 -
• Simpletest still in core but deprecated (to be removed in D9)
• PHPUnit introduced into core
• This presentation focuses exclusively on PHPUnit
TYPES OF TESTS IN DRUPAL 8
• Unit tests
• Kernel tests
• Functional tests
• JavaScript functional tests
UNIT TESTS IN DRUPAL 8
• A Unit is a PHP Class (OOP)
• Unit tests test code, not user-end functionality
• Unit tests will test a single class, to ensure that it behaves as
expected
• Unit tests test the unit (class) alone in isolation, rather than in the
Drupal environment
• Unit testing is very fast, as the system does not need to be
bootstrapped to run the tests
UNIT TEST OVERVIEW
• Unit tests go in [MODULENAME]/tests/src/Unit
• Namespace is DrupalTests[MODULENAME]Unit
• Unit tests extend DrupalTestsUnitTestCase
• Annotation should include (at a minimum)
• Class:
• @coversDefaultClass - the class the the test is testing
• @group - the group of tests (usually module name) that the test belongs to
• Method:
• @covers - the method of the class being tested
UNIT TEST OVERVIEW
• Testing class name should end in ‘Test’
• Example: the test for the Person class would be PersonTest
• Testing method (function) name must start with ‘test’
• Example: the method used to test the id() method of Person
would be testId()
UNIT TEST OVERVIEW
• Test classes can have a setUp() method, that sets up
conditions/objects before each test in the test class.
• Useful when all tests require a similar set of conditions
• Test classes can also have a tearDown() method, where objects
are cleaned up after each test in the test class.
• Test classes can have a setUpBeforeClass() method that is run
once before the test class is run
• Test classes can have a tearDownAfterClass() method that is run
once after the test class is finished
CLASS (UNIT) TO BE TESTED
class Person {
private $id;
public function setId($id) {
$this->id = $id;
}
public function id() {
return $this->id();
}
}
EXAMPLE UNIT TEST FOR PERSON CLASS
/**
* @coversDefaultClass Person
*/
class PersonTest {
/**
* @covers ::setId()
*/
public testId() {
$person = new Person();
$person->setId(123);
$this->assertNotNull($person->getId(), ‘A value is returned for the ID’);
$this->assertTrue(is_int($person->id()), ‘The returned ID is an
integer’);
$this->assertEqual(123, $this->getId(), ‘The returned ID is correct’);
}
}
KERNEL TESTS
KERNEL TESTS IN DRUPAL 8
• Kernel tests are executed in a limited Drupal environment, similar to
the environment before Drupal has been installed
• Tests can access files and the database
• Declared modules are loaded, but not installed. Installation needs
to be done manually
• Kernel tests are slower than Unit tests, but faster than Functional
tests
KERNEL TEST OVERVIEW
• Kernel tests go in [MODULENAME]/tests/src/Kernel
• Namespace is DrupalTests[MODULENAME]Kernel
• Kernel tests extend DrupalTestsKernelTestBast
EXAMPLE KERNEL TEST
Sorry no example!
FUNCTIONAL TESTS IN DRUPAL 8
• Functional tests work in an installed Drupal environment
• Modules needed for the test need to be declared for installation
• Tests use an internal browser (aka code - not visual), where links
can be clicked, form elements can be filled out, and pages can be
requested, all programmatically
• Users, roles, blocks and other entities can be created
• Tests are slow as each test builds a new Drupal instance in which
to run the tests
FUNCTIONAL TEST OVERVIEW
• Unit tests go in [MODULENAME]/tests/src/Functional
• Namespace is DrupalTests[MODULENAME]Functional
• Unit tests extend DrupalTestsBrowserTestBase
• Annotation should include (at a minimum)
• Class:
• @group - the group of tests (usually module name) that the test belongs to
• $modules property contains an array of modules to be installed
• example: $modules = [‘node’, ‘restrict_ip’]
FROM RESTRICT IP MODULE
EXAMPLE FUNCTIONAL TEST
namespace DrupalTestsrestrict_ipFunctional;
/**
* @group restrict_ip
*/
class RestrictIpAccessTest extends RestrictIpBrowserTestBase // which extends BrowserTestBase
{
protected static $modules = ['restrict_ip', 'node'];
/**
* Test that a user is blocked when the module is enabled
*/
public function testModuleEnabled()
{
$adminUser = $this->drupalCreateUser(['administer restricted ip addresses', 'access administration
pages', 'administer modules']);
$this->drupalLogin($adminUser);
$this->drupalGet('admin/config/people/restrict_ip');
$this->assertStatusCodeEquals(200);
$this->checkCheckbox('#edit-enable');
$this->click('#edit-submit');
$this->assertSession()->pageTextContains('The page you are trying to access cannot be accessed from
your IP address.');
}
}
JAVASCRIPT FUNCTIONAL TESTS IN DRUPAL
8
• JavaScript Functional tests work in a fully installed Drupal
environment
• Extends Functional tests to include JavaScript
• Require PhantomJS browser
• Virtual browser (no GUI)
• Requires installation on testing computer/server
• Can test #ajax methods, as well as other JavaScript functionality
JAVASCRIPT FUNCTIONAL TEST OVERVIEW
• Unit tests go in [MODULENAME]/tests/src/FunctionalJavascript
• Namespace is
DrupalTests[MODULENAME]FunctionalJavascript
• Unit tests extend
DrupalFunctionalJavascriptTestsJavascriptTestBase
• Annotation should include (at a minimum)
• Class:
• @group - the group of tests (usually module name) that the test
belongs to
FROM FANCY LOGIN MODULE
EXAMPLE JAVASCRIPT FUNCTIONAL TEST
namespace DrupalTestsfancy_loginFunctionalJavascript;
/**
* @group fancy_login
*/
class FancyLoginJavascriptTest extends FancyLoginJavascriptTestBase // which extends JavascriptTestBase
{
public function testDimmerBackgroundColor()
{
$this->openPopup();
$this->assertJsCondition('jQuery("#fancy_login_dim_screen").not(":animated")');
$this->assertJsCondition('jQuery("#fancy-login-user-login-form").not(":animated")');
$script = $this->createScriptString('#fancy_login_dim_screen', 'background-color', 'rgb(255, 255,
255)');
if(!$this->getSession()->evaluateScript($script))
{
throw new Exception('background-color is not white');
}
// …
}
}
WRITE TESTS THEN CODE
TESTING DRIVEN DEVELOPMENT
• Write tests as the start of the project, rather than the end
• Developers build and test as they go
• Gives a clear indicator of what to do next
• Gives a clear indication of when the project is complete
• Note - testing driven development is purely theoretical for me - I’ve
never done it
WHERE TO GO FROM HERE
• PHPUnit in Drupal 8 - https://www.drupal.org/docs/8/phpunit
• Documentation is limited
• Lots and lots of Googling
Thank you!
(Questions?)

More Related Content

PPTX
Employee Security Awareness Training
PDF
DOS, DDOS Atakları ve Korunma Yöntemleri
PDF
Welcome to the Jungle: Pentesting AWS
PDF
BEST CYBER SECURITY PRACTICES
PDF
Threat Hunting Procedures and Measurement Matrice
ODP
Top 10 Web Security Vulnerabilities
PDF
The New Pentest? Rise of the Compromise Assessment
PDF
Application Security - Your Success Depends on it
Employee Security Awareness Training
DOS, DDOS Atakları ve Korunma Yöntemleri
Welcome to the Jungle: Pentesting AWS
BEST CYBER SECURITY PRACTICES
Threat Hunting Procedures and Measurement Matrice
Top 10 Web Security Vulnerabilities
The New Pentest? Rise of the Compromise Assessment
Application Security - Your Success Depends on it

What's hot (20)

PDF
Identity and Access Management 101
PDF
Azure Just in Time Privileged Identity Management
PDF
Security and Virtualization in the Data Center
PDF
Zmap Hack The Planet
PPTX
Cloud Security (AWS)
PPTX
Identity and Access Management (IAM): Benefits and Best Practices 
PPTX
Network security presentation
PDF
Data Center Security
PDF
사물 인터넷 개발자를 위한 AWS IoT 신규서비스 살펴보기 (윤석찬, AWS테크에반젤리스트)
PDF
Attribute based access control
PPTX
VAPT PRESENTATION full.pptx
PDF
Access Security - Privileged Identity Management
PDF
Temel Cisco Komutlari Ve Ornekler
PDF
Mapping to MITRE ATT&CK: Enhancing Operations Through the Tracking of Interac...
PDF
Microsoft Defender and Azure Sentinel
PDF
Next Generation War: EDR vs RED TEAM
PPTX
Power of the cloud - Introduction to azure security
PDF
Zero Trust Model Presentation
PPTX
Linux privilege escalation 101
PPTX
Data breach presentation
Identity and Access Management 101
Azure Just in Time Privileged Identity Management
Security and Virtualization in the Data Center
Zmap Hack The Planet
Cloud Security (AWS)
Identity and Access Management (IAM): Benefits and Best Practices 
Network security presentation
Data Center Security
사물 인터넷 개발자를 위한 AWS IoT 신규서비스 살펴보기 (윤석찬, AWS테크에반젤리스트)
Attribute based access control
VAPT PRESENTATION full.pptx
Access Security - Privileged Identity Management
Temel Cisco Komutlari Ve Ornekler
Mapping to MITRE ATT&CK: Enhancing Operations Through the Tracking of Interac...
Microsoft Defender and Azure Sentinel
Next Generation War: EDR vs RED TEAM
Power of the cloud - Introduction to azure security
Zero Trust Model Presentation
Linux privilege escalation 101
Data breach presentation
Ad

Similar to Automated php unit testing in drupal 8 (20)

PDF
Automated testing in Drupal
PPTX
Testing
PPTX
Test in action – week 1
PPTX
Principles and patterns for test driven development
PPTX
Java 201 Intro to Test Driven Development in Java
PDF
Drupalcamp Simpletest
PDF
Testing In Drupal
PDF
Staging Drupal 8 31 09 1 3
PDF
Breaking Dependencies to Allow Unit Testing
PDF
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
PPTX
Generalization in Auto-Testing. How we put what we had into new Technological...
PPTX
Breaking Dependencies to Allow Unit Testing
PDF
Test Driven Development with JavaFX
PPTX
Qt test framework
 
PDF
junit-160729073220 eclipse software testing.pdf
PPSX
PDF
Into The Box 2018 | Assert control over your legacy applications
PDF
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
PDF
Apache DeltaSpike
PPTX
Unit tests = maintenance hell ?
Automated testing in Drupal
Testing
Test in action – week 1
Principles and patterns for test driven development
Java 201 Intro to Test Driven Development in Java
Drupalcamp Simpletest
Testing In Drupal
Staging Drupal 8 31 09 1 3
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Generalization in Auto-Testing. How we put what we had into new Technological...
Breaking Dependencies to Allow Unit Testing
Test Driven Development with JavaFX
Qt test framework
 
junit-160729073220 eclipse software testing.pdf
Into The Box 2018 | Assert control over your legacy applications
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Apache DeltaSpike
Unit tests = maintenance hell ?
Ad

Recently uploaded (20)

PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
KodekX | Application Modernization Development
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Cloud computing and distributed systems.
PDF
Empathic Computing: Creating Shared Understanding
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Encapsulation_ Review paper, used for researhc scholars
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
MYSQL Presentation for SQL database connectivity
Agricultural_Statistics_at_a_Glance_2022_0.pdf
KodekX | Application Modernization Development
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Mobile App Security Testing_ A Comprehensive Guide.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Cloud computing and distributed systems.
Empathic Computing: Creating Shared Understanding
Advanced methodologies resolving dimensionality complications for autism neur...
20250228 LYD VKU AI Blended-Learning.pptx
Review of recent advances in non-invasive hemoglobin estimation
Network Security Unit 5.pdf for BCA BBA.
Encapsulation_ Review paper, used for researhc scholars
“AI and Expert System Decision Support & Business Intelligence Systems”
Unlocking AI with Model Context Protocol (MCP)
Understanding_Digital_Forensics_Presentation.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
MYSQL Presentation for SQL database connectivity

Automated php unit testing in drupal 8

  • 2. • @jaypan on Drupal.org and drupal.stackexchange.com • Acquia certified Drupal Grandmaster • Acquia Certified Developer • Acquia Certified Developer – Front end specialist • Acquia Certified Developer – Back end specialist • Living in Japan since 2000 • Working with Drupal since 2007 • Currently writing a book on coding in Drupal JAY FRIENDLY
  • 3. JAY FRIENDLY • Owner of Jaypan in Yokohama • English https://www.jaypan.com • Japanese https://www.jaypan.jp • Jaypan specializes in • high-performance AJAX/JavaScript heavy applications • Custom module/theme development • App Development • Drupal integration with outside technologies • JavaScript libraries • Linux programs • Multiple Drupal instances • Technical consulting and translation (Japanese/English)
  • 4. OVERVIEW • Manual testing vs. automated testing • How do automated tests work? • History of testing in Drupal • Types of automated tests in Drupal • Discussion of each type of test
  • 5. MANUAL TESTING • Developer creates new functionality • Developer tests new functionality • Other people (client, team-members) test new functionality • Found bugs are fixed
  • 6. PROBLEMS WITH MANUAL TESTING • Complex functionality requires significant time to test • Easy to forget to test a given scenario • Changes to code require re-testing every scenario after any change • Changes to code in other parts of the system may break functionality without anyone realizing it • As time passes, the conditions that need to be tested may be forgotten or lost as project members change • Coming back to code after a period of time means the developer is not sure what is required
  • 7. AUTOMATED TESTING • Developer creates automated tests that run through all testing scenarios • Testing system runs all tests and reports any behaviors that are unexpected (aka bugs)
  • 8. BENEFITS OF AUTOMATED TESTING • Removes requirement of getting humans to test after each code change • Tests are faster than human testing • Tests for the whole system can be run before committing any code to a production server, to ensure new functionality in one part of the system hasn’t broken functionality in another part of the system. • If (or rather, when) new bugs are found, tests can be added along with the fix, to ensure that the bug never arises again • Overall system is more stable.
  • 9. PROBLEMS WITH AUTOMATED TESTING • Writing tests takes a significant amount of time • Extra time means extra development resources • Clients cannot directly see tests, and may not understand the extra costs in developing when there is nothing for them to look at. • Tests only test what they have been written to test. If the developer does not think to test something, a bug could exist. The existence of automated tests in such a case may create a false sense of security • Tests happen in a virtual (non-visible) environment, making them hard to debug (and even create) • Changing code often requires re-writing old tests
  • 10. OR IN OTHER WORDS, WHAT IS IT? HOW DOES A TEST WORK? • A test will first run some code, then do ‘assertions’ to ensure that the results work as expected. • For example, in Drupal 8, nodes have a method id(), that returns the ID of the node. • An automated test would create a new node object, then run $node->id() and test: • Was a result returned? • Is the result an integer? • Is the returned ID the expected (correct) ID of the node that was created? • Any failed assertions result in a failed test, telling the developer exactly what failed, so they know what to fix.
  • 11. AUTOMATED TESTING IN DRUPAL - HISTORY • Drupal 6 - Simpletest module • Drupal 7 - Simpletest in core • Drupal 8 - • Simpletest still in core but deprecated (to be removed in D9) • PHPUnit introduced into core • This presentation focuses exclusively on PHPUnit
  • 12. TYPES OF TESTS IN DRUPAL 8 • Unit tests • Kernel tests • Functional tests • JavaScript functional tests
  • 13. UNIT TESTS IN DRUPAL 8 • A Unit is a PHP Class (OOP) • Unit tests test code, not user-end functionality • Unit tests will test a single class, to ensure that it behaves as expected • Unit tests test the unit (class) alone in isolation, rather than in the Drupal environment • Unit testing is very fast, as the system does not need to be bootstrapped to run the tests
  • 14. UNIT TEST OVERVIEW • Unit tests go in [MODULENAME]/tests/src/Unit • Namespace is DrupalTests[MODULENAME]Unit • Unit tests extend DrupalTestsUnitTestCase • Annotation should include (at a minimum) • Class: • @coversDefaultClass - the class the the test is testing • @group - the group of tests (usually module name) that the test belongs to • Method: • @covers - the method of the class being tested
  • 15. UNIT TEST OVERVIEW • Testing class name should end in ‘Test’ • Example: the test for the Person class would be PersonTest • Testing method (function) name must start with ‘test’ • Example: the method used to test the id() method of Person would be testId()
  • 16. UNIT TEST OVERVIEW • Test classes can have a setUp() method, that sets up conditions/objects before each test in the test class. • Useful when all tests require a similar set of conditions • Test classes can also have a tearDown() method, where objects are cleaned up after each test in the test class. • Test classes can have a setUpBeforeClass() method that is run once before the test class is run • Test classes can have a tearDownAfterClass() method that is run once after the test class is finished
  • 17. CLASS (UNIT) TO BE TESTED class Person { private $id; public function setId($id) { $this->id = $id; } public function id() { return $this->id(); } }
  • 18. EXAMPLE UNIT TEST FOR PERSON CLASS /** * @coversDefaultClass Person */ class PersonTest { /** * @covers ::setId() */ public testId() { $person = new Person(); $person->setId(123); $this->assertNotNull($person->getId(), ‘A value is returned for the ID’); $this->assertTrue(is_int($person->id()), ‘The returned ID is an integer’); $this->assertEqual(123, $this->getId(), ‘The returned ID is correct’); } }
  • 19. KERNEL TESTS KERNEL TESTS IN DRUPAL 8 • Kernel tests are executed in a limited Drupal environment, similar to the environment before Drupal has been installed • Tests can access files and the database • Declared modules are loaded, but not installed. Installation needs to be done manually • Kernel tests are slower than Unit tests, but faster than Functional tests
  • 20. KERNEL TEST OVERVIEW • Kernel tests go in [MODULENAME]/tests/src/Kernel • Namespace is DrupalTests[MODULENAME]Kernel • Kernel tests extend DrupalTestsKernelTestBast
  • 22. FUNCTIONAL TESTS IN DRUPAL 8 • Functional tests work in an installed Drupal environment • Modules needed for the test need to be declared for installation • Tests use an internal browser (aka code - not visual), where links can be clicked, form elements can be filled out, and pages can be requested, all programmatically • Users, roles, blocks and other entities can be created • Tests are slow as each test builds a new Drupal instance in which to run the tests
  • 23. FUNCTIONAL TEST OVERVIEW • Unit tests go in [MODULENAME]/tests/src/Functional • Namespace is DrupalTests[MODULENAME]Functional • Unit tests extend DrupalTestsBrowserTestBase • Annotation should include (at a minimum) • Class: • @group - the group of tests (usually module name) that the test belongs to • $modules property contains an array of modules to be installed • example: $modules = [‘node’, ‘restrict_ip’]
  • 24. FROM RESTRICT IP MODULE EXAMPLE FUNCTIONAL TEST namespace DrupalTestsrestrict_ipFunctional; /** * @group restrict_ip */ class RestrictIpAccessTest extends RestrictIpBrowserTestBase // which extends BrowserTestBase { protected static $modules = ['restrict_ip', 'node']; /** * Test that a user is blocked when the module is enabled */ public function testModuleEnabled() { $adminUser = $this->drupalCreateUser(['administer restricted ip addresses', 'access administration pages', 'administer modules']); $this->drupalLogin($adminUser); $this->drupalGet('admin/config/people/restrict_ip'); $this->assertStatusCodeEquals(200); $this->checkCheckbox('#edit-enable'); $this->click('#edit-submit'); $this->assertSession()->pageTextContains('The page you are trying to access cannot be accessed from your IP address.'); } }
  • 25. JAVASCRIPT FUNCTIONAL TESTS IN DRUPAL 8 • JavaScript Functional tests work in a fully installed Drupal environment • Extends Functional tests to include JavaScript • Require PhantomJS browser • Virtual browser (no GUI) • Requires installation on testing computer/server • Can test #ajax methods, as well as other JavaScript functionality
  • 26. JAVASCRIPT FUNCTIONAL TEST OVERVIEW • Unit tests go in [MODULENAME]/tests/src/FunctionalJavascript • Namespace is DrupalTests[MODULENAME]FunctionalJavascript • Unit tests extend DrupalFunctionalJavascriptTestsJavascriptTestBase • Annotation should include (at a minimum) • Class: • @group - the group of tests (usually module name) that the test belongs to
  • 27. FROM FANCY LOGIN MODULE EXAMPLE JAVASCRIPT FUNCTIONAL TEST namespace DrupalTestsfancy_loginFunctionalJavascript; /** * @group fancy_login */ class FancyLoginJavascriptTest extends FancyLoginJavascriptTestBase // which extends JavascriptTestBase { public function testDimmerBackgroundColor() { $this->openPopup(); $this->assertJsCondition('jQuery("#fancy_login_dim_screen").not(":animated")'); $this->assertJsCondition('jQuery("#fancy-login-user-login-form").not(":animated")'); $script = $this->createScriptString('#fancy_login_dim_screen', 'background-color', 'rgb(255, 255, 255)'); if(!$this->getSession()->evaluateScript($script)) { throw new Exception('background-color is not white'); } // … } }
  • 28. WRITE TESTS THEN CODE TESTING DRIVEN DEVELOPMENT • Write tests as the start of the project, rather than the end • Developers build and test as they go • Gives a clear indicator of what to do next • Gives a clear indication of when the project is complete • Note - testing driven development is purely theoretical for me - I’ve never done it
  • 29. WHERE TO GO FROM HERE • PHPUnit in Drupal 8 - https://www.drupal.org/docs/8/phpunit • Documentation is limited • Lots and lots of Googling