What Is Testing?
Default set of Asymmetric Matchers-
The testing is a tools and techniques for a unit
and integration testing Angular applications.
Why Test?
Tests are the best ways to prevent software bugs
and defects.
How to Setup Test in Angular Project?
Angular CLI install everything you need to test
an Angular application.
This CLI command takes care of Jasmine and karma
configuration for you.
Run this CLI command-
ng test
The test file extension must be “.spec.ts” so
that tooling can identify the test file.
You can also unit test your app using other testing
libraries and test runners.
Types
of Test –
The all great developer knows his/her testing
tools use. Understanding your tools for testing is essential before diving into
writing tests.
The Testing depends on your project requirements
and the project cost. The types of Testing looks like -
1. Unit
Test
2. Integration
Test
3. End
to End (e2e) Test
What is Unit Test in Angular?
The Unit Test is used to testing a single
function, single components in Isolation. This is very fast.
The Unit Test is sometimes also called isolated
testing
In this Test, we are not able to say that
everything is all right in the application. Just for a single Unit or function
assure that working fine.
What Is Integration Testing in Angular?
The Integration Testing is used to testing a
component with templates and this testing containing more time as per
comparison Unit Test.
What is End-to-End (e2e) Testing in Angular?
The End to End Testing is used to testing the
entire application looks like -
1.
All User Interactions
2.
All Service Calls
3.
Authentication/Authorization of app
4.
Everything of App
This is the actual testing of your append it is
fast action.
Unit testing and Integrations testing will do as
fake calls but e2e testing is done with your actual Services and APIs calls.
Recommended Unit Testing Tools –
1.
Karma
2.
Jasmine and
3.
QUnit
Do I Need to Use Protractor?
A protractor is an official library to use for
writing End-to-End (e2e) test suites with an Angular app. It is nothing but a
wrapper over the Selenium WebDriverJS APIs.
If you have been using Angular CLI, you might
know that by default, it comes shipped with two frameworks for testing. They
are:
1. unit
tests using Jasmine and Karma
2. end-to-end
tests using Protractor
The apparent difference between the two is that
the former is used to test the logic of the components and services, while the
latter is used to ensure that the high-level functionality of the application
works as expected.
Protractor configuration file is - protractor.conf.js
and it look like this.
//Protractor configuration file
const
{ SpecReporter } = require('jasmine-spec-reporter');
exports.config
= {
allScriptsTimeout:
11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName':
'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval:
30000,
print:
function() {}
},
onPrepare() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
jasmine.getEnv().addReporter(new
SpecReporter({ spec:
{ displayStacktrace:
true } }));
}
};
What Is Test Function?
After installing everything as per your project
requirements, CREATE your project.
The following Steps –
·
ng new YourTestProject
·
ng install
·
ng serve/ng test
Note
– If you are going to development then type “ng server” command and if you want
to test your project, you should type “ng test” command. After type “ng test” command and press enter.
It’s taking some time to installing everything in your project for a test.
Test functions–
1.
describe – Test suit (just a
function)
2.
it
- The spec or test
3.
expect - Expected outcome.
Triple Rule of Testing –
1.
Arrange - Create and Initialize the
Components
2.
Act - Invoke the Methods/Functions of
Components
3.
Assert - Assert the expected
outcome/behavior
Best Practices - The quick list of best
practices.
1.
Use beforeEach() to Initialize the
context for your tests.
2.
Make sure the string descriptions you
put in describe () and it () make sense as output
3.
Use after () and afterEach () to
clean-up your tests if there is any state that may bleed over.
4.
If any one test is over 15 lines of
code, you may need to refactor the test
Example -
import
{ TestBed, async
} from '@angular/core/testing';
import
{ AppComponent } from
'./app.component';
//describe – Test suit (just a
function)
describe('AppComponent',
() => {
beforeEach(async(()
=> {
TestBed.configureTestingModule({
declarations: [AppComponent]
}).compileComponents();
}));
//it - The spec or test
it('should have hello
property', function()
{
const fixture
= TestBed.createComponent(AppComponent);
const app
= fixture.debugElement.componentInstance;
//expect – this is expected outcome.
expect(app.hello).toBe('Hello,
Anil!');
});
});
What is the Jasmine test framework?
Why Jasmine?
Jasmine is a JavaScript testing framework that
supports a software development practice called Behaviour Driven Development that
plays very well with Karma.
It’s a specific flavor of Test Driven Development
(TDD).
Jasmine is also dependency-free and doesn’t
require a DOM.
Jasmine provides a rich set of pre-defined
matchers - default set of matchers
1.
expect(number).toBeGreaterThan(number);
2.
expect(number).toBeLessThan(number);
3.
expect(array).toContain(member);
4.
expect(array).toBeArray();
5.
expect(fn).toThrow(string);
6.
expect(fn).toThrowError(string);
7.
expect(instance).toBe(instance);
represents the exact equality (===) operator.
8.
expect(mixed).toBeDefined();
9.
expect(mixed).toBeFalsy();
10. expect(mixed).toBeNull();
11. expect(mixed).toBeTruthy();
12. expect(mixed).toBeUndefined();
13. expect(mixed).toEqual(mixed);
represents the regular equality (==) operator.
14. expect(mixed).toMatch(pattern);
calls the RegExp match() method behind the scenes to compare string data.
15. expect(number).toBeCloseTo(number,
decimalPlaces);
16. expect(number).toBeNaN();
17. expect(spy).toHaveBeenCalled();
18. expect(spy).toHaveBeenCalledTimes(number);
19. expect(date).toBeAfter(otherDate);
20. expect(date).toBeBefore(otherDate);
21. expect(date).toBeDate();
22. expect(date).toBeValidDate();
23. expect(object).toHaveDate(memberName);
24. expect(object).toHaveDateAfter(memberName,
date);
25. expect(object).toHaveDateBefore(memberName,
date);
26. expect(regexp).toBeRegExp();
27. expect(string).toBeEmptyString();
28. expect(string).toBeHtmlString();
29. expect(string).toBeIso8601();
30. expect(string).toBeJsonString();
31. expect(string).toBeLongerThan();
32. expect(string).toBeString();
Default set of Asymmetric Matchers-
1.
jasmine.any(Constructor);
2.
jasmine.anything(mixed);
3.
jasmine.arrayContaining(mixed);
4.
jasmine.objectContaining(mixed);
5.
jasmine.stringMatching(pattern);
Lest see the testing example for AppComponent and
it look like this.
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('AppComponent',
() => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should
create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it(`should
have as title 'app'`, async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('app');
}));
it('should
render title in a h1 tag', async(() => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('Welcome
to app!');
}));
});
What Is TestBed?
The Angular TestBed (ATB) is a higher level
Angular testing framework that allows you to easily test behavior that depends
on the Angular Framework.
The TestBed creates a dynamically and The TestBed.configureTestingModule() method
takes a metadata object.
We still write our tests in Jasmine and run using
Karma but we now have a slightly easier way to create components, handle
injection, test asynchronous behaviour and interact with our application.
See the above example.
Lest
of some objective questions -
Which of the following can be used
to run unit tests?
1. Karma
2. Protractor
The correct answer is - Karma!
Which of the following can be used
to run end-to-end tests?
1. Karma
2. Protractor
The correct answer is - Protractor!
Test doubles are needed when
writing which of the following?
1. Unit
tests
2. End-to-end
tests
The correct answer is - Unit tests!
Which of the following will need
Angular testing utilities for unit testing?
1. Services
2. Components
3. All
the above
The correct answer is - Components!
It is recommended to write isolated
unit tests for which of the following?
1. Services
2. Pipes
3. All
the above
The correct answer is - All the above!
Which of the following TestBed
method is used to create an Angular component under test?
1. createComponent
2. createTestingComponent
3. configureComponent
4. configureTestingComponent
The correct answer is - createComponent!