Introduction To Testing In JavaScript With Jest

Web Dev Simplified
24 Sept 201913:56

Summary

TLDRIn this informative tutorial, Kyle from Web Dev Simplified introduces viewers to the fundamentals of JavaScript testing using the Jest library. He demonstrates how to set up a testing environment, write unit tests for simple functions like sum, subtract, and array cloning, and utilize Jest's matchers to ensure code correctness. The video also highlights the importance of testing in development, its role in identifying bugs during code changes, and the confidence it provides when making large-scale updates to complex applications.

Takeaways

  • 😀 Testing in JavaScript is a crucial skill for developers that can set them apart in the job market.
  • 🔍 The video introduces 'jest', a popular JavaScript testing library, as an essential tool for testing.
  • 📚 The tutorial starts with the basics of setting up 'jest' by initializing 'package.json' and installing it as a development dependency.
  • 🛠️ It demonstrates how to write tests for simple JavaScript functions like adding, subtracting numbers, and duplicating arrays.
  • 📝 The script explains the process of creating test files with the naming convention of appending '.test' to the original file name.
  • 🧐 The importance of using 'expect' and 'toBe' in 'jest' for asserting that function outputs match expected results is highlighted.
  • 🔄 The video clarifies the difference between 'toBe' (for strict equality) and 'toEqual' (for deep equality) in testing arrays.
  • 📊 'jest' offers code coverage analysis, which is shown to ensure that all parts of the code are being tested.
  • 🔍 The script emphasizes the value of unit testing, which focuses on testing individual components or functions in isolation.
  • 🛡️ Tests provide confidence when making changes to the code, as they help identify any breaks or issues that arise from modifications.
  • 🌟 The video concludes by advocating for the practice of testing as a means to ensure code quality and simplify the development process.

Q & A

  • What is the main topic of the video?

    -The main topic of the video is testing in JavaScript, focusing on how to get started with testing using the Jest library.

  • Why is testing an important skill for developers?

    -Testing is an important skill for developers because it helps set them apart from others who don't know testing, and it gives them an advantage when applying for jobs.

  • What does the instructor suggest for simplifying web development?

    -The instructor suggests using the Jest library for testing in JavaScript as a way to simplify web development and ensure code quality.

  • What are the JavaScript files created for the purpose of this video?

    -The JavaScript files created for this video are simple functions for adding two numbers, subtracting two numbers, and duplicating an array.

  • What is the spread operator in JavaScript and what does it do?

    -The spread operator in JavaScript is a syntax that allows the expansion of elements from an iterable (like an array) into individual elements, and it is used for duplicating an array in the video.

  • How do you install the Jest library for testing in JavaScript?

    -You install the Jest library by running 'npm install --save-dev jest', which adds Jest as a development dependency.

  • What is the purpose of the 'test' script in the package.json file?

    -The 'test' script in the package.json file is used to run the Jest testing framework with the command 'npm test'.

  • How do you create a test file for a JavaScript function?

    -To create a test file, you name it the same as the file you want to test with '.test' appended to the filename and '.js' as the extension.

  • What is the 'expect' function used for in Jest tests?

    -The 'expect' function in Jest is used to specify the expected outcome of a test, allowing for assertions such as equality or matching certain conditions.

  • What does the 'toBe' matcher in Jest do?

    -The 'toBe' matcher in Jest checks for strict equality, ensuring that the expected value and the actual value are identical in both value and reference.

  • Why is it important to test individual functions in unit testing?

    -Testing individual functions in unit testing is important because it isolates each part of the code, making it easier to identify and fix issues when a test fails.

  • How can running tests help with making changes to the code?

    -Running tests helps with making changes to the code by verifying that the changes did not break any existing functionality, providing immediate feedback if something is wrong.

  • What is the purpose of code coverage in testing?

    -The purpose of code coverage in testing is to measure how much of the codebase is executed during the tests, ensuring that all parts of the code are tested and reducing the risk of undetected issues.

  • How does testing provide confidence when making large changes to an application?

    -Testing provides confidence when making large changes to an application by quickly identifying any breaks or issues, allowing developers to ensure that the application remains stable and functional after changes.

  • What is the benefit of having a test suite for a large application?

    -A test suite for a large application allows for quick and automated testing of the entire codebase, reducing the need for time-consuming manual testing and providing assurance that changes do not introduce new issues.

Outlines

00:00

💻 Introduction to JavaScript Testing with Jest

The video begins by emphasizing the importance of testing in JavaScript, highlighting it as a crucial skill for developers that can give them an edge in the job market. The host, Kyle, introduces the topic and his intention to simplify web development for viewers. He presents a few simple JavaScript files with basic functions like adding and subtracting numbers and duplicating arrays. The focus then shifts to using the Jest library for testing, starting with initializing a project with 'npm init' and installing Jest as a development dependency. The video guides viewers on setting up the testing script to run tests using Jest and creating the first test for the sum function. It explains how to write a test using the 'test' function in Jest, asserting the expected outcome with 'expect'.

05:01

🔍 Deep Dive into Writing Tests and Understanding Test Results

This section delves deeper into the process of writing tests for different functions, such as cloning an array and subtracting numbers. It clarifies the difference between 'toBe' and 'toEqual' in Jest, explaining object equality and value equality. The video demonstrates how to create a test for the 'cloneArray' function, emphasizing the importance of ensuring that the cloned array is a duplicate and not a reference to the original. It also shows how to test the 'subtract' function and the importance of accurate naming in test cases. The host introduces code coverage as a way to measure how much of the code is being tested, using Jest's coverage feature to generate a report and an HTML file that visually represents which parts of the code are covered by tests.

10:02

🛠 The Importance of Testing and Unit Testing Philosophy

The final part of the video discusses the broader significance of testing in software development. It uses a scenario where a change in the 'sum' function leads to a test failure, illustrating how tests can catch bugs early. The video explains the concept of unit testing, focusing on testing individual components of code in isolation. It argues for the simplicity and effectiveness of unit tests in identifying specific failures within small code units. The host also touches on the psychological benefits of tests, providing developers with confidence to make changes knowing that their test suite will catch any issues. The video concludes with a call to action for viewers to engage with more testing content and to provide feedback on creating further videos on the topic.

Mindmap

Keywords

💡Testing

Testing in the context of software development refers to the process of verifying that a program or system performs as intended. It's a crucial skill for developers, as it helps ensure the quality and reliability of the code. In the video, testing is the main theme, with the speaker emphasizing its importance for setting developers apart and providing an advantage in the job market.

💡JavaScript

JavaScript is a high-level, interpreted programming language commonly used for enhancing web pages with interactive elements. In the video, JavaScript is the programming language in which the testing is being demonstrated, with the speaker showing how to write and execute tests for JavaScript functions.

💡Jest

Jest is a popular JavaScript testing library known for its simplicity and robust feature set, which includes features for snapshot testing, mocking, and a extensive assertion library. The video uses Jest to illustrate how to write tests for JavaScript functions, emphasizing its ease of use and popularity among developers.

💡npm

npm stands for Node Package Manager and is a tool for managing JavaScript packages, among other things. It is used to install and manage dependencies in a JavaScript project. In the script, npm is used to initialize a new project with a 'package.json' file and to install Jest as a development dependency.

💡spread operator

The spread operator in JavaScript is used to expand elements of an iterable (such as an array) into individual elements. In the video, the spread operator is mentioned in the context of duplicating an array, showcasing its utility in creating a new array from an existing one.

💡unit testing

Unit testing is a method of testing where individual components or units of a software are tested to determine if they are fit for use. The video focuses on unit testing, demonstrating how to write tests for small units of JavaScript code, such as functions, to ensure they behave as expected.

💡expect

In the context of testing with Jest, 'expect' is a function used to create an assertion, which is a statement that tests whether the output of a code block matches the expected result. The video script uses 'expect' to check if the sum of two numbers or the cloning of an array produces the correct output.

💡test coverage

Test coverage measures the degree to which the code is tested by the available test suite. It is an important metric to ensure that all parts of the code are being tested. The video script mentions using Jest's coverage feature to verify that all lines and functions of the code are tested.

💡assertions

Assertions are statements in a test that check for conditions that should be true. In the video, assertions are used with the 'expect' function to verify that the results of functions like 'sum' and 'cloneArray' meet the expected outcomes, such as the sum of 1 and 2 being equal to 3.

💡refactoring

Refactoring is the process of restructuring existing computer code without changing its external behavior to improve nonfunctional attributes of the software. In the script, the speaker mentions refactoring as a scenario where tests provide confidence that changes made to the code do not break existing functionality.

Highlights

Introduction to the importance of testing in JavaScript for developers.

Using testing to set oneself apart in the job market.

Introduction to the 'jest' library for JavaScript testing.

Explanation of how to initialize a project for testing with 'npm init'.

Installation of 'jest' as a development dependency.

Configuring the 'package.json' to include a test script.

Creating test files by appending '.test' to the original file name.

Importing functions to be tested in the test files.

Writing the first test using 'test' function and 'expect'.

Demonstration of a passing test for the 'sum' function.

Explanation of 'expect' syntax and available matchers.

Testing the 'cloneArray' function for deep equality.

Difference between 'toBe' and 'toEqual' in testing.

Ensuring the 'cloneArray' function creates a distinct copy.

Creating tests for the 'subtract' function similar to 'sum'.

Running tests and understanding test results.

Using '--coverage' flag to check code coverage.

Importance of testing in catching bugs when modifying code.

Concept of unit testing and its benefits in isolating issues.

Building confidence in code changes through testing.

Encouragement to explore more on testing and request for feedback.

Transcripts

play00:00

hello everyone in today's video I'm

play00:02

going to be covering testing in

play00:04

JavaScript which is one of the most

play00:06

important skills you can know as a

play00:07

developer it's something a lot of people

play00:10

don't teach or focus on but if you know

play00:13

testing it's gonna set you apart from

play00:15

every other developer that doesn't know

play00:17

testing and give you that extra leg up

play00:19

when you're applying for jobs so in

play00:21

today's video I'm gonna show you the

play00:23

very basics of how to get started with

play00:25

testing in JavaScript using chests

play00:30

welcome back to web dev simplified my

play00:33

name is Kyle and my job is to simplify

play00:35

the web for you so you can start

play00:37

building your dream projects quicker and

play00:39

better and if that sounds interesting

play00:41

make sure you subscribe to my channel

play00:43

for more videos just like this one and

play00:45

to get started in this video I have

play00:47

something a little bit different than

play00:48

usual I have a few files already created

play00:50

and these are very simple JavaScript

play00:52

files all they do is to find a very

play00:54

simple function and then export that

play00:56

function for us in our case we have a

play00:58

function that adds two numbers we have a

play01:00

function that subtracts two numbers and

play01:02

we have a function that duplicates an

play01:04

array and if you aren't familiar with

play01:05

this spread operator syntax I have an

play01:08

entire video that covers it links in the

play01:10

cards and the description down below if

play01:12

you're interested but essentially all

play01:13

this is doing is duplicating the array

play01:16

and creating a brand new array from the

play01:17

current array that were given and as I

play01:20

mentioned at the beginning of this video

play01:21

we're going to be talking about testing

play01:22

and how to test in JavaScript and the

play01:25

easiest way to do that in my opinion is

play01:27

to use the library called gest which is

play01:29

an incredibly popular and well-built

play01:31

testing library inside of javascript so

play01:34

in order to start this all we need to do

play01:35

is run NPM an it hash that's why to it

play01:39

that way it will initialize with all the

play01:41

default values and this gives us our

play01:42

starting point package.json next we need

play01:46

to install so we're gonna NPM - - save

play01:49

dev and we want to install just this is

play01:52

going to be our testing library and the

play01:53

reason we're saving it as a development

play01:55

dependency is because we only use this

play01:57

testing library in development to make

play02:00

sure everything runs now that that is

play02:01

done downloading we can come in here

play02:03

where we have our test script and we can

play02:05

just change this by typing in jest and

play02:08

essentially now when we run NPM test

play02:11

it's going to actually run just and run

play02:13

our tests but of course right now we

play02:15

don't have any tests so this is just

play02:17

going to fail so to get started creating

play02:19

your very first test all you need to do

play02:21

is create a new file give it the exact

play02:23

same name as the file you want to test

play02:25

in our case we'll test some and then you

play02:27

just say dot test and then j/s so

play02:30

essentially you just take the same file

play02:31

name add test to the end of it and make

play02:33

sure the Dodge is stays at the very end

play02:35

now inside of this file all we need to

play02:38

do is import our sum function because as

play02:40

you remember here we're exporting a

play02:42

function called sum so we're going to

play02:44

import that function by just saying in

play02:45

here we want to require dot slash sum

play02:48

this is going to import this sum

play02:50

function and then we can actually write

play02:52

a test for this so what we want to do is

play02:55

to test to make sure our sum function

play02:57

works so essentially we want to test

play02:59

that when we give it two parameters for

play03:00

example one plus two we want to test to

play03:03

make sure that that is equal to three

play03:05

and in order to write a test with just

play03:07

we use this function called

play03:09

test and the very first parameter to

play03:12

this test function is just a string of

play03:14

what the test is doing so in our case we

play03:16

can just say that it properly adds two

play03:19

numbers you just write what you want to

play03:21

test inside of that string because this

play03:23

will actually show up inside of the

play03:25

console when we run this test the second

play03:27

thing is going to be a function and this

play03:29

function is what gets called to run your

play03:31

test so we have a test which is going to

play03:33

properly add two numbers and then it

play03:35

calls this function and inside this

play03:37

function we need to make sure that our

play03:39

expected result happens and in order to

play03:42

do that normally in JavaScript you maybe

play03:43

would put like an if you could say if

play03:45

sum of 1 and 2 is equal to 3 then you

play03:50

want to run some code inside of here

play03:51

otherwise if it doesn't work you want to

play03:54

throw some kind of error maybe and that

play03:56

would be how you would do this as normal

play03:57

JavaScript but this is kind of bulky and

play03:59

hard to use so we'll just they actually

play04:02

have functions built-in that allow you

play04:03

to do this testing and those test

play04:06

functions are called expect just like

play04:09

that so what we're saying is we expect

play04:10

something to equal something else so we

play04:13

are expecting sum of one and two and we

play04:16

want this to be 3 so we could just say

play04:18

to be and we pass in 3 now if we save

play04:22

that and run this you should see that

play04:25

our test you're going to run and they

play04:26

are going to pass

play04:27

as you can see it's running this test

play04:28

right now and you can see it's ran all

play04:30

of our tests and they're passed let's

play04:32

just expand this up so we can see it

play04:33

easier and you can see that it ran

play04:35

properly adds two numbers in two

play04:37

milliseconds and it passed and it says

play04:39

everything is working fine and it took

play04:40

about two seconds to run everything

play04:41

let's bring that back down and I'm going

play04:44

to go into this syntax a little bit more

play04:46

because this looks really confusing I

play04:48

guarantee so let's break this out so

play04:50

it's a little bit easier to read and

play04:51

know exactly what's going on the first

play04:54

section we have is expect and expect

play04:56

takes anything that we want and we're

play04:59

saying we expect whatever is inside of

play05:01

this section to do something related to

play05:03

the other section and there's a lot of

play05:04

functions we can use for example to be

play05:06

to equal not to be to be Nold to be

play05:09

undefined and so on there's quite a lot

play05:11

of different matches that you could use

play05:13

in this case but for our simple example

play05:15

what we're doing is checking that one

play05:16

plus two is the same as three and in our

play05:19

case that passed and ran correctly

play05:21

now let's go over to our clone array

play05:23

function here and what we want to do is

play05:25

we want to test to make sure our array

play05:27

is the same we just want to make sure

play05:29

that we created a duplicate array that

play05:30

is exactly the same so let's create that

play05:32

new file clone array SJS and inside of

play05:38

here again we need to import our clone

play05:40

array function so we can just do that

play05:42

require oops require dot slash clone

play05:47

array and then inside of here all we

play05:49

need to do is do that test if we want to

play05:51

say it properly

play05:52

clones array and in here we can just run

play05:57

that we want to say expect clone array

play06:01

and we want to create an array first so

play06:03

we're just going to say Const array it's

play06:05

going to be equal to just two array with

play06:07

some random numbers in it so we want to

play06:10

expect this is going to be our array and

play06:13

we're actually going to get a failure

play06:14

when we do this so let's just run this

play06:16

test real quick and this is actually the

play06:18

difference between to be and to equal so

play06:21

once we get this we're going to scroll

play06:22

up so we can see our error and as you

play06:24

can see right here it says what did

play06:26

expect receive to be expected object is

play06:28

equality if it should pass with deep

play06:30

equality replace to be with too strict

play06:33

equal and it says expected one two three

play06:34

and it says received serializes to the

play06:37

same string so this is kind of saying is

play06:39

it saying these objects

play06:41

look to be exactly the same the value

play06:42

seems to be the same but there are

play06:44

actually different places in memory

play06:45

because remember I said clone array this

play06:48

is actually creating a brand new array

play06:50

with all of the same values so now we

play06:52

have two arrays that are both

play06:54

referencing they both have the same

play06:55

value but they're referenced by

play06:57

different memory addresses and this

play06:58

sounds a little bit confusing but I have

play07:00

an entire video on pass by value and

play07:02

pass by reference that I break this down

play07:04

in so you can check that out linked in

play07:06

the cards and the description below but

play07:07

essentially what we need to use is

play07:09

something called to equal instead now if

play07:12

we run our test this is actually going

play07:14

to pass because our arrays both have the

play07:16

same structure they're both 1 2 3 and as

play07:19

you can see they both passed they just

play07:21

don't have the same memory address so we

play07:23

can use a second test where we can say -

play07:26

we want this to be not to be array and

play07:30

we can run that and the reason we're

play07:32

testing this is we want to make sure our

play07:33

clone array is actually making a copy

play07:35

and then it's not just the exact same

play07:37

array and as you can see that passed so

play07:40

we made sure our array is the same right

play07:42

1 2 3 and we also made sure that it

play07:44

created a clone instead of just

play07:45

returning the exact same array it

play07:47

created a clone of that array a little

play07:50

bit confusing but as I mentioned you can

play07:51

check out that video and it will break

play07:53

down pass by reference and pass by value

play07:54

for you really easily now one last thing

play07:57

we need to do is let's create a test for

play07:59

our subtract test Jas and inside of here

play08:03

I'm just going to copy our sum test

play08:04

because it's going to be very similar we

play08:07

want to make sure we import our subtract

play08:09

method and we want to do that this is

play08:11

properly subtracting two numbers and of

play08:14

course we need this to be negative 1

play08:16

because 1 minus 2 is negative 1 let's

play08:19

run that and agur of course we should

play08:21

say here that all of our tests are going

play08:22

to pass as soon as this finishes and as

play08:24

you can see we're getting an error and

play08:26

that's just because this needs to be

play08:27

subtract instead of sum and now when we

play08:30

run this test we should get everything

play08:32

to pass again which is going to be

play08:33

perfect and just a second there we go

play08:35

everything passed but it's kind of hard

play08:37

to tell what parts of our code are

play08:39

tested right now it just says that our

play08:41

tests passed but how do we know which

play08:43

functions got tested which lines got

play08:45

tested and this is actually really easy

play08:47

to do we just need to pass in the - -

play08:50

coverage property to our just test now

play08:53

if we save this

play08:54

and run our test again it's actually

play08:56

going to make note of every single line

play08:58

that gets ran every single function that

play09:00

gets ran and make sure our code is

play09:01

tested 100% and as you can see here it

play09:04

says that all of our files have all the

play09:06

statements branches functions and lines

play09:08

tested 100% and it even generates up

play09:11

here an HTML file index.html if we open

play09:14

this up I bring this over you can see

play09:17

that it actually has all of our code

play09:18

being tested 100% but if for some reason

play09:22

instead of our sum we had a separate

play09:23

function let's just say we had a

play09:25

function called helper and this function

play09:28

is just going to do something let's just

play09:30

say it logs out helper now if we run our

play09:33

test we are actually test this function

play09:35

nowhere in our test are we running this

play09:38

helper function ever so you're going to

play09:39

see down here when this finishes that we

play09:42

have some of our code not being tested

play09:44

and we can just open this back up so we

play09:46

can actually see and as you can see we

play09:48

get generated out that only 66% of our

play09:51

statements are tested 50% of our

play09:52

functions and if we click on it you can

play09:54

see in red is all the sections that are

play09:56

not being tested which makes it really

play09:58

easy to note if we're actually testing

play09:59

everything that we want to test

play10:01

now before I died of any further I want

play10:04

to step back a little bit and talk about

play10:05

testing as a whole why it's important

play10:08

and how you can actually go about doing

play10:09

it in an easy manner because I've shown

play10:11

you how to actually write your tests for

play10:13

your functions by using the text test

play10:15

keyword and the expect as well as to be

play10:18

two equal to other things I don't know

play10:20

what you want to test and that's all

play10:21

great but how do you know you're writing

play10:23

good test and why do you even bother

play10:25

writing tests well let's say for example

play10:28

we want to change our sum KS and we're

play10:31

coming in here we're making a bunch of

play10:32

changes we're writing all this new code

play10:34

and somewhere along the lines if we

play10:36

accidentally change this B to a so now

play10:38

our code is saying return a plus a

play10:40

obviously a plus a is not going to be

play10:43

what we want so now when we run our test

play10:45

again we're gonna get a failure so this

play10:47

is a way for us to be able to change our

play10:49

code and know that everything is working

play10:51

properly if our test passed or if in

play10:54

this case our tests fail we know

play10:56

somewhere along the lines we broke our

play10:58

sum function because our TAS are tests

play11:00

for properly adding two numbers is now

play11:03

failing so what we do is we're going to

play11:05

go back look at our sum function to

play11:06

realize oh whoops we changed our

play11:08

to a B or a B to an A let's change it

play11:10

back to the beef run our test and this

play11:12

is just a really great way to verify

play11:14

your program does what you want it to do

play11:16

and in all of these tests I'm doing

play11:18

what's called the unit testing and unit

play11:20

testing is when you test the smallest

play11:22

unit of your code in our case this is

play11:24

just a single function we want to test

play11:26

only one single thing at a time for

play11:29

example I could write a fancy big test

play11:31

that could test some it could test clone

play11:33

over a Anika test subtract all at once

play11:35

and do all this crazy testing but that

play11:37

would be a lot harder to write and it

play11:39

wouldn't really tell you that much if

play11:41

that test breaks is your problem in sum

play11:43

is it in clone array is it in subtract

play11:45

is it even somewhere else with unit

play11:47

tests what you're doing is you're

play11:48

breaking your code down into really

play11:50

really small components essentially

play11:52

small units and you're testing these

play11:54

individual units so now you know if your

play11:56

test for a single unit failed that that

play11:58

single unit is broken and you know

play12:00

exactly where to go to fix it also it

play12:03

allows you to write really small tests

play12:05

because you're only testing a small part

play12:06

of your code so you only need to make

play12:08

sure inputs and outputs for that very

play12:10

small section of code are what you

play12:12

expect so it makes testing really easy

play12:14

because your tests are just super simple

play12:16

like this obviously in your use case

play12:18

your test might be slightly more complex

play12:20

than just one plus two but it's still

play12:22

going to be incredibly simple another

play12:25

really important thing about tests is

play12:26

that they give you confidence let's say

play12:28

our application is hundreds of thousands

play12:31

and millions of lines of code long and

play12:32

we want to make some really large change

play12:34

to our code we want to refactor it so it

play12:37

does something slightly differently that

play12:38

it didn't do before and it's doing a lot

play12:40

of different changes we're touching a

play12:42

lot of different files and it's hard to

play12:44

manually test your application maybe

play12:46

it's a huge website with thousands of

play12:48

webpages and manually testing all of

play12:50

that is impossible it'll take hundreds

play12:52

of hours to manually test so you can't

play12:54

manually test after every change but you

play12:57

have your test suite with all these

play12:59

different individual tests and all you

play13:00

need to do is just run it npm test and

play13:03

it'll tell you if anything inside of

play13:04

your code is broken now obviously it's

play13:07

hard to make your test 100% cover every

play13:10

single type of edge case that you could

play13:11

have but the goal is to make your test

play13:13

as bulletproof as possible so almost

play13:16

every single thing that can happen in

play13:18

your application will be tested so you

play13:20

know that if your test suite passes

play13:22

you know that your application is good

play13:24

to roll out to production and you don't

play13:25

have to do lengthy manual testing you

play13:28

only need to do a small amount of manual

play13:30

testing just to verify for yourself that

play13:32

everything works but other than that you

play13:34

can just push it up to production as

play13:35

long as your tests actually pass so

play13:37

there is a really quick overview of unit

play13:39

testing with chest if you enjoyed that

play13:42

video make sure you check out my other

play13:43

videos linked over here and subscribe to

play13:46

my channel for more videos just like

play13:47

this I would love to make more testing

play13:49

related videos so if that sounds

play13:51

interesting to you make sure let me know

play13:52

down in the comments below thank you

play13:54

very much for watching and have a good

play13:56

day

Rate This

5.0 / 5 (0 votes)

相关标签
JavaScriptTestingJestWeb DevelopmentUnit TestingCode TestingDeveloper SkillsSoftware QualityEducationalTech Tutorial
您是否需要英文摘要?