{"id":9384,"date":"2025-04-15T15:48:49","date_gmt":"2025-04-15T08:48:49","guid":{"rendered":"https:\/\/mb668s.com\/cam-nang-7mb66-xoc-dia\/?p=9384"},"modified":"2025-04-15T15:48:51","modified_gmt":"2025-04-15T08:48:51","slug":"cypress-la-gi","status":"publish","type":"post","link":"https:\/\/mb668s.com\/cam-nang-7mb66-xoc-dia\/tu-van-nghe-nghiep\/cypress-la-gi","title":{"rendered":"Cypress l\u00e0 g\u00ec? Gi\u1ea3i ph\u00e1p ki\u1ec3m th\u1eed hi\u1ec7n \u0111\u1ea1i cho l\u1eadp tr\u00ecnh vi\u00ean front-end"},"content":{"rendered":"\n
Vi\u1ec7c \u0111\u1ea3m b\u1ea3o ch\u1ea5t l\u01b0\u1ee3ng ph\u1ea7n m\u1ec1m ngay t\u1eeb giai \u0111o\u1ea1n ph\u00e1t tri\u1ec3n \u0111\u00e3 tr\u1edf th\u00e0nh \u01b0u ti\u00ean h\u00e0ng \u0111\u1ea7u trong nhi\u1ec1u d\u1ef1 \u00e1n c\u00f4ng ngh\u1ec7. Khi y\u00eau c\u1ea7u v\u1ec1 t\u1ed1c \u0111\u1ed9 v\u00e0 \u0111\u1ed9 ch\u00ednh x\u00e1c ng\u00e0y c\u00e0ng t\u0103ng, c\u00e1c c\u00f4ng c\u1ee5 h\u1ed7 tr\u1ee3 ki\u1ec3m th\u1eed t\u1ef1 \u0111\u1ed9ng d\u1ea7n chi\u1ebfm v\u1ecb tr\u00ed quan tr\u1ecdng trong quy tr\u00ecnh l\u00e0m vi\u1ec7c c\u1ee7a l\u1eadp tr\u00ecnh vi\u00ean. C\u00e2u h\u1ecfi Cypress l\u00e0 g\u00ec<\/strong> xu\u1ea5t hi\u1ec7n nh\u01b0 m\u1ed9t ph\u1ea7n trong qu\u00e1 tr\u00ecnh t\u00ecm ki\u1ebfm gi\u1ea3i ph\u00e1p gi\u00fap r\u00fat ng\u1eafn th\u1eddi gian ki\u1ec3m th\u1eed m\u00e0 v\u1eabn duy tr\u00ec \u0111\u01b0\u1ee3c \u0111\u1ed9 tin c\u1eady c\u1ee7a s\u1ea3n ph\u1ea9m tr\u01b0\u1edbc khi \u0111\u01b0a ra th\u1ecb tr\u01b0\u1eddng.<\/p>\n\n\n\n Cypress l\u00e0 m\u1ed9t framework ki\u1ec3m th\u1eed t\u1ef1 \u0111\u1ed9ng m\u00e3 ngu\u1ed3n m\u1edf, \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng nh\u1eb1m h\u1ed7 tr\u1ee3 vi\u1ec7c ki\u1ec3m th\u1eed end-to-end cho c\u00e1c \u1ee9ng d\u1ee5ng web hi\u1ec7n \u0111\u1ea1i.<\/strong><\/p>\n<\/blockquote>\n\n\n\n Cypress kh\u00e1c v\u1edbi c\u00e1c c\u00f4ng c\u1ee5 truy\u1ec1n th\u1ed1ng nh\u01b0 Selenium, Cypress th\u1ef1c thi m\u00e3 ki\u1ec3m th\u1eed tr\u1ef1c ti\u1ebfp b\u00ean trong tr\u00ecnh duy\u1ec7t, t\u1eeb \u0111\u00f3 gi\u00fap t\u0103ng t\u1ed1c \u0111\u1ed9 ch\u1ea1y test, c\u1ea3i thi\u1ec7n \u0111\u1ed9 ch\u00ednh x\u00e1c v\u00e0 \u0111\u01a1n gi\u1ea3n h\u00f3a quy tr\u00ecnh debug. V\u1edbi c\u00fa ph\u00e1p th\u00e2n thi\u1ec7n, \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng JavaScript, Cypress \u0111\u1eb7c bi\u1ec7t ph\u00f9 h\u1ee3p cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean front-end \u0111ang ph\u00e1t tri\u1ec3n v\u1edbi React, Vue ho\u1eb7c Angular.<\/p>\n\n\n\n Cypress kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 ki\u1ec3m th\u1eed \u0111\u01a1n thu\u1ea7n, m\u00e0 c\u00f2n l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho c\u00e1c \u0111\u1ed9i ng\u0169 ph\u00e1t tri\u1ec3n front-end hi\u1ec7n \u0111\u1ea1i nh\u1edd h\u00e0ng lo\u1ea1t t\u00ednh n\u0103ng m\u1ea1nh m\u1ebd v\u00e0 tr\u1ea3i nghi\u1ec7m th\u00e2n thi\u1ec7n v\u1edbi l\u1eadp tr\u00ecnh vi\u00ean. Nh\u1eefng \u0111i\u1ec3m n\u1ed5i b\u1eadt d\u01b0\u1edbi \u0111\u00e2y gi\u00fap Cypress tr\u1edf n\u00ean kh\u00e1c bi\u1ec7t so v\u1edbi c\u00e1c c\u00f4ng c\u1ee5 ki\u1ec3m th\u1eed truy\u1ec1n th\u1ed1ng, \u0111\u1eb7c bi\u1ec7t l\u00e0 v\u1ec1 hi\u1ec7u su\u1ea5t, kh\u1ea3 n\u0103ng quan s\u00e1t v\u00e0 t\u00edch h\u1ee3p li\u1ec1n m\u1ea1ch v\u00e0o qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m.<\/p>\n\n\n\n M\u1ed9t trong nh\u1eefng \u01b0u \u0111i\u1ec3m n\u1ed5i b\u1eadt \u0111\u1ea7u ti\u00ean c\u1ee7a Cypress l\u00e0 qu\u00e1 tr\u00ecnh c\u00e0i \u0111\u1eb7t c\u1ef1c k\u1ef3 \u0111\u01a1n gi\u1ea3n. Ng\u01b0\u1eddi d\u00f9ng ch\u1ec9 c\u1ea7n m\u1ed9t d\u00f2ng l\u1ec7nh Cypress h\u1ed7 tr\u1ee3 c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng reload khi thay \u0111\u1ed5i m\u00e3 ngu\u1ed3n ki\u1ec3m th\u1eed, gi\u00fap ti\u1ebft ki\u1ec7m th\u1eddi gian trong qu\u00e1 tr\u00ecnh vi\u1ebft v\u00e0 ch\u1ec9nh s\u1eeda test. Ngo\u00e0i ra, t\u00ednh n\u0103ng time-travel cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng \u201cquay l\u1ea1i\u201d t\u1eebng b\u01b0\u1edbc th\u1ef1c thi test \u0111\u1ec3 ki\u1ec3m tra tr\u1ea1ng th\u00e1i c\u1ee7a DOM v\u00e0 d\u1eef li\u1ec7u \u1ee9ng d\u1ee5ng t\u1ea1i m\u1ed7i th\u1eddi \u0111i\u1ec3m. \u0110i\u1ec1u n\u00e0y gi\u00fap x\u00e1c \u0111\u1ecbnh l\u1ed7i nhanh ch\u00f3ng v\u00e0 ch\u00ednh x\u00e1c h\u01a1n r\u1ea5t nhi\u1ec1u so v\u1edbi c\u00e1ch debug truy\u1ec1n th\u1ed1ng.<\/p>\n\n\n\n Cypress cung c\u1ea5p giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng tr\u1ef1c quan \u0111\u1ec3 theo d\u00f5i ti\u1ebfn tr\u00ecnh th\u1ef1c thi c\u00e1c test case. M\u1ed7i b\u01b0\u1edbc ki\u1ec3m th\u1eed \u0111\u1ec1u \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb r\u00f5 r\u00e0ng k\u00e8m theo log chi ti\u1ebft, tr\u1ea1ng th\u00e1i \u0111\u1ea7u v\u00e0o \u2013 \u0111\u1ea7u ra v\u00e0 \u1ea3nh ch\u1ee5p m\u00e0n h\u00ecnh t\u01b0\u01a1ng \u1ee9ng. \u0110\u00e2y l\u00e0 l\u1ee3i th\u1ebf l\u1edbn gi\u00fap l\u1eadp tr\u00ecnh vi\u00ean ho\u1eb7c tester d\u1ec5 d\u00e0ng ph\u00e2n t\u00edch h\u00e0nh vi c\u1ee7a \u1ee9ng d\u1ee5ng, \u0111\u1eb7c bi\u1ec7t trong c\u00e1c t\u00ecnh hu\u1ed1ng ph\u00e1t sinh l\u1ed7i ph\u1ee9c t\u1ea1p.<\/p>\n\n\n\n To\u00e0n b\u1ed9 m\u00e3 ki\u1ec3m th\u1eed trong Cypress \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng JavaScript \u2013 ng\u00f4n ng\u1eef quen thu\u1ed9c v\u1edbi ph\u1ea7n l\u1edbn l\u1eadp tr\u00ecnh vi\u00ean front-end. \u0110i\u1ec1u n\u00e0y gi\u00fap r\u00fat ng\u1eafn \u0111\u01b0\u1eddng cong h\u1ecdc t\u1eadp, \u0111\u1ed3ng th\u1eddi t\u1eadn d\u1ee5ng \u0111\u01b0\u1ee3c to\u00e0n b\u1ed9 h\u1ec7 sinh th\u00e1i c\u1ee7a JavaScript v\u00e0 Node.js. Vi\u1ec7c s\u1eed d\u1ee5ng c\u00fa ph\u00e1p th\u00e2n thi\u1ec7n, h\u00e0m b\u1ea5t \u0111\u1ed3ng b\u1ed9 (async), v\u00e0 API r\u00f5 r\u00e0ng c\u0169ng khi\u1ebfn vi\u1ec7c vi\u1ebft test tr\u1edf n\u00ean t\u1ef1 nhi\u00ean nh\u01b0 vi\u1ebft m\u00e3 \u1ee9ng d\u1ee5ng.<\/p>\n\n\n\n Cypress h\u1ed7 tr\u1ee3 t\u1ed1t vi\u1ec7c t\u00edch h\u1ee3p v\u00e0o c\u00e1c quy tr\u00ecnh CI\/CD th\u00f4ng qua d\u00f2ng l\u1ec7nh ho\u1eb7c c\u1ea5u h\u00ecnh YAML. C\u00f4ng c\u1ee5 n\u00e0y t\u01b0\u01a1ng th\u00edch v\u1edbi nhi\u1ec1u n\u1ec1n t\u1ea3ng nh\u01b0 GitHub Actions, GitLab CI, Jenkins hay CircleCI. Nh\u1edd kh\u1ea3 n\u0103ng ch\u1ea1y test tr\u00ean m\u00f4i tr\u01b0\u1eddng headless, Cypress \u0111\u1ea3m b\u1ea3o qu\u00e1 tr\u00ecnh ki\u1ec3m th\u1eed \u0111\u01b0\u1ee3c t\u1ef1 \u0111\u1ed9ng h\u00f3a ho\u00e0n to\u00e0n tr\u01b0\u1edbc khi \u0111\u01b0a \u1ee9ng d\u1ee5ng ra m\u00f4i tr\u01b0\u1eddng production, t\u1eeb \u0111\u00f3 gi\u00fap gi\u1ea3m r\u1ee7i ro v\u00e0 t\u0103ng t\u00ednh \u1ed5n \u0111\u1ecbnh.<\/p>\n\n\n\n M\u1ed9t trong nh\u1eefng l\u00fd do khi\u1ebfn Cypress ng\u00e0y c\u00e0ng \u0111\u01b0\u1ee3c \u01b0a chu\u1ed9ng l\u00e0 qu\u00e1 tr\u00ecnh c\u00e0i \u0111\u1eb7t v\u00e0 s\u1eed d\u1ee5ng c\u1ef1c k\u1ef3 \u0111\u01a1n gi\u1ea3n, ph\u00f9 h\u1ee3p cho c\u1ea3 ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u l\u1eabn c\u00e1c d\u1ef1 \u00e1n quy m\u00f4 l\u1edbn. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 c\u00e1c b\u01b0\u1edbc c\u01a1 b\u1ea3n \u0111\u1ec3 b\u1ea1n c\u00f3 th\u1ec3 nhanh ch\u00f3ng l\u00e0m quen v\u1edbi c\u00f4ng c\u1ee5 ki\u1ec3m th\u1eed m\u1ea1nh m\u1ebd n\u00e0y.<\/p>\n\n\n\n Tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u, b\u1ea1n c\u1ea7n \u0111\u1ea3m b\u1ea3o m\u00e1y t\u00ednh \u0111\u00e3 c\u00e0i \u0111\u1eb7t Node.js<\/strong> v\u00e0 npm (Node Package Manager)<\/strong> \u2013 hai c\u00f4ng c\u1ee5 n\u1ec1n t\u1ea3ng trong h\u1ec7 sinh th\u00e1i JavaScript. Cypress t\u01b0\u01a1ng th\u00edch v\u1edbi c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh ph\u1ed5 bi\u1ebfn nh\u01b0 Windows, macOS v\u00e0 Linux. Ngo\u00e0i ra, b\u1ea1n n\u00ean chu\u1ea9n b\u1ecb s\u1eb5n m\u1ed9t tr\u00ecnh qu\u1ea3n l\u00fd m\u00e3 ngu\u1ed3n nh\u01b0 Git v\u00e0 m\u00f4i tr\u01b0\u1eddng IDE (nh\u01b0 Visual Studio Code) \u0111\u1ec3 thu\u1eadn ti\u1ec7n trong qu\u00e1 tr\u00ecnh vi\u1ebft v\u00e0 ch\u1ea1y test.<\/p>\n\n\n\n \u0110\u1ec3 c\u00e0i \u0111\u1eb7t Cypress, b\u1ea1n ch\u1ec9 c\u1ea7n m\u1edf terminal v\u00e0 ch\u1ea1y l\u1ec7nh sau trong th\u01b0 m\u1ee5c d\u1ef1 \u00e1n:<\/p>\n\n\n\n bash<\/p>\n\n\n\n L\u1ec7nh n\u00e0y s\u1ebd t\u1ea3i v\u00e0 c\u00e0i Cypress nh\u01b0 m\u1ed9t ph\u1ea7n c\u1ee7a m\u00f4i tr\u01b0\u1eddng ph\u00e1t tri\u1ec3n, \u0111\u1ed3ng th\u1eddi th\u00eam v\u00e0o file bash<\/p>\n\n\n\n C\u1eeda s\u1ed5 Cypress Test Runner s\u1ebd hi\u1ec7n ra, cho ph\u00e9p b\u1ea1n t\u1ea1o, ch\u1ecdn v\u00e0 ch\u1ea1y c\u00e1c t\u1eadp tin ki\u1ec3m th\u1eed m\u1ed9t c\u00e1ch tr\u1ef1c quan.<\/p>\n\n\n\n Sau khi m\u1edf Cypress, h\u1ec7 th\u1ed1ng s\u1ebd t\u1ea1o s\u1eb5n th\u01b0 m\u1ee5c javascript<\/p>\n\n\n\n describe
<\/figure>\n\n\n\nCypress l\u00e0 g\u00ec?<\/h2>\n\n\n\n
\n
T\u00ednh n\u0103ng v\u00e0 \u01b0u \u0111i\u1ec3m v\u01b0\u1ee3t tr\u1ed9i Cypress<\/h2>\n\n\n\n
D\u1ec5 d\u00e0ng c\u00e0i \u0111\u1eb7t v\u00e0 t\u00edch h\u1ee3p<\/h3>\n\n\n\n
npm install cypress<\/code> l\u00e0 c\u00f3 th\u1ec3 b\u1eaft \u0111\u1ea7u vi\u1ebft test m\u00e0 kh\u00f4ng c\u1ea7n thi\u1ebft l\u1eadp m\u00f4i tr\u01b0\u1eddng ph\u1ee9c t\u1ea1p hay c\u00e0i \u0111\u1eb7t th\u00eam tr\u00ecnh \u0111i\u1ec1u khi\u1ec3n nh\u01b0 Selenium. Cypress ho\u1ea1t \u0111\u1ed9ng tr\u1ef1c ti\u1ebfp tr\u00ean tr\u00ecnh duy\u1ec7t v\u1edbi c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh th\u00f4ng minh, gi\u00fap gi\u1ea3m thi\u1ec3u th\u1eddi gian chu\u1ea9n b\u1ecb v\u00e0 d\u1ec5 d\u00e0ng t\u00edch h\u1ee3p v\u00e0o c\u00e1c d\u1ef1 \u00e1n hi\u1ec7n c\u00f3.<\/p>\n\n\n\nT\u1ef1 \u0111\u1ed9ng reload v\u00e0 time-travel<\/h3>\n\n\n\n
Giao di\u1ec7n tr\u1ef1c quan v\u00e0 debug hi\u1ec7u qu\u1ea3<\/h3>\n\n\n\n
Vi\u1ebft test b\u1eb1ng JavaScript hi\u1ec7n \u0111\u1ea1i<\/h3>\n\n\n\n
T\u00edch h\u1ee3p CI\/CD thu\u1eadn ti\u1ec7n<\/h3>\n\n\n\n
C\u00e1c b\u01b0\u1edbc c\u00e0i \u0111\u1eb7t v\u00e0 s\u1eed d\u1ee5ng Cypress c\u01a1 b\u1ea3n<\/h2>\n\n\n\n
Y\u00eau c\u1ea7u h\u1ec7 th\u1ed1ng<\/h3>\n\n\n\n
C\u00e0i \u0111\u1eb7t Cypress<\/h3>\n\n\n\n
npm install cypress --save-dev<\/code><\/p>\n\n\n\npackage.json<\/code>. Sau khi c\u00e0i \u0111\u1eb7t, b\u1ea1n c\u00f3 th\u1ec3 m\u1edf giao di\u1ec7n Cypress b\u1eb1ng l\u1ec7nh:<\/p>\n\n\n\nnpx cypress open<\/code><\/p>\n\n\n\nVi\u1ebft v\u00e0 ch\u1ea1y test case \u0111\u1ea7u ti\u00ean<\/h3>\n\n\n\n
cypress\/e2e<\/code>. B\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t file test m\u1edbi t\u1ea1i \u0111\u00e2y, v\u00ed d\u1ee5 homepage.cy.js<\/code>, v\u1edbi n\u1ed9i dung \u0111\u01a1n gi\u1ea3n nh\u01b0 sau:<\/p>\n\n\n\n(<\/code>‘Trang ch\u1ee7’, <\/code>() => {<\/code><\/p>\n\n\n\n <\/code>it(<\/code>‘Hi\u1ec3n th\u1ecb \u0111\u00fang ti\u00eau \u0111\u1ec1’, <\/code>() => {<\/code><\/p>\n\n\n\n