<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Automation FC Blog: Framework]]></title><description><![CDATA[Các bài viết để tạo ra 1 Automation Testing Framework từ con số 0]]></description><link>https://blog.automationfc.vn/s/framework</link><image><url>https://substackcdn.com/image/fetch/$s_!5XlR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e1c48af-fd94-4190-945e-91f2be65af76_1280x1280.png</url><title>Automation FC Blog: Framework</title><link>https://blog.automationfc.vn/s/framework</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Apr 2026 08:00:44 GMT</lastBuildDate><atom:link href="https://blog.automationfc.vn/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Automation FC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[automationfc@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[automationfc@substack.com]]></itunes:email><itunes:name><![CDATA[Đào Minh Đảm]]></itunes:name></itunes:owner><itunes:author><![CDATA[Đào Minh Đảm]]></itunes:author><googleplay:owner><![CDATA[automationfc@substack.com]]></googleplay:owner><googleplay:email><![CDATA[automationfc@substack.com]]></googleplay:email><googleplay:author><![CDATA[Đào Minh Đảm]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[[Framework 02] - Nguyên tắc DRY (Don't Repeat Yourself)]]></title><description><![CDATA[C&#225;c nguy&#234;n t&#7855;c DRY KISS YAGNI]]></description><link>https://blog.automationfc.vn/p/dry-pattern</link><guid isPermaLink="false">https://blog.automationfc.vn/p/dry-pattern</guid><dc:creator><![CDATA[Đào Minh Đảm]]></dc:creator><pubDate>Wed, 26 Feb 2020 10:42:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e290b65e-638c-4795-b2df-c121cdf0b417_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Xin ch&#224;o c&#225;c b&#7841;n - &#273;&#226;y lo&#7841;t b&#224;i vi&#7871;t h&#432;&#7899;ng d&#7851;n v&#7873; Build Automation Framework. C&#225;c b&#224;i vi&#7871;t n&#224;y &#273;&#432;&#7907;c h&#432;&#7899;ng d&#7851;n t&#7915; kh&#243;a h&#7885;c <a href="https://automationfc.vn/khoa-hoc/selenium-java-framework-page-object">Build Automation Framework in Java with Page Object Pattern</a> - b&#7841;n n&#224;o quan t&#226;m v&#224; mu&#7889;n l&#224;m b&#224;i b&#7843;n th&#236; n&#234;n tham gia &#273;&#7875; h&#7885;c v&#224; th&#7921;c h&#224;nh tr&#234;n d&#7921; &#225;n t&#7915; A-Z nh&#233;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_05_13-build-test-automation-framework-in-java.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UMOs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 424w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 848w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UMOs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png" width="616" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_05_13-build-test-automation-framework-in-java.png&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!UMOs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 424w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 848w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!UMOs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f78750-893f-4d6d-b769-e50595bb2445_1521x1328.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>B&#224;i vi&#7871;t n&#224;y h&#432;&#7899;ng d&#7851;n t&#7841;o test sample &#273;&#7847;u ti&#234;n &#273;&#7875; ki&#7875;m tra m&#244;i tr&#432;&#7901;ng c&#243; ho&#7841;t &#273;&#7897;ng &#273;&#250;ng hay kh&#244;ng - test n&#224;y s&#7869; vi&#7871;t theo d&#7841;ng basic m&#7909;c &#273;&#237;ch &#273;&#7875; so s&#225;nh v&#7899;i c&#225;c c&#225;ch vi&#7871;t kh&#225;c (c&#225;c b&#224;i sau) - n&#243;i r&#245; &#432;u nh&#432;&#7907;c &#273;i&#7875;m t&#7841;i sao l&#7841;i c&#7847;n tri&#7875;n khai framework v&#224; kh&#244;ng n&#234;n vi&#7871;t test theo d&#7841;ng basic (step-by-step) nh&#432; th&#7871; n&#224;y</p><h2><strong>Test business</strong></h2><ul><li><p>C&#225;c testcase &#273;&#7875; validate cho form login</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-09_52_18-customer-login.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R8bP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 424w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 848w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 1272w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R8bP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png" width="616" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:304,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-09_52_18-customer-login.png&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!R8bP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 424w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 848w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 1272w, https://substackcdn.com/image/fetch/$s_!R8bP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F858f63db-616b-4eb8-a325-820dfc89f7cb_1143x564.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><ul><li><p>Testcase 01 - Login v&#7899;i email/ password l&#224; empty</p></li><li><p>Testcase 02 - Login v&#7899;i email invalid (123@456.789)</p></li><li><p>Testcase 03 - Login v&#7899;i email incorrect (not existing)</p></li><li><p>Testcase 04 - Login v&#7899;i password invalid (nh&#7887; h&#417;n 6 k&#237; t&#7921;)</p></li><li><p>Testcase 05 - Login v&#7899;i password incorrect (nh&#7853;p sai password)</p></li><li><p>Testcase 06 - Login v&#7899;i email/ password h&#7907;p l&#7879;</p></li></ul></li></ul><h2><strong>Code demo</strong></h2><ul><li><p>Link - <a href="https://gist.github.com/daominhdam/72db7eadfe4e2a52380d96801f4dd930">https://gist.github.com/daominhdam/72db7eadfe4e2a52380d96801f4dd930</a></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_00_50-workspace-test-automation-framework_testcases_com_liveguru_login_login_01_step.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ag60!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 424w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 848w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 1272w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ag60!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png" width="616" height="335" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:335,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_00_50-workspace-test-automation-framework_testcases_com_liveguru_login_login_01_step.png&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ag60!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 424w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 848w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 1272w, https://substackcdn.com/image/fetch/$s_!Ag60!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb3b7cb8-61fb-4652-a42f-802a2c3e94b6_2080x1132.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Test Result</strong></h2><a class="image-link image2" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_04_10-workspace-eclipse-ide.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Zcm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 424w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 848w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 1272w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Zcm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png" width="616" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/02/2020-02-26-10_04_10-workspace-eclipse-ide.png&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4Zcm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 424w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 848w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 1272w, https://substackcdn.com/image/fetch/$s_!4Zcm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a582c-b351-4b14-b051-78fcc13d51fa_1693x608.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><h2><strong>Ph&#226;n t&#237;ch</strong></h2><ul><li><p><strong>&#431;u &#273;i&#7875;m:</strong></p><ul><li><p>Vi&#7871;t nhanh cho nh&#7919;ng ch&#7913;c n&#259;ng &#273;&#417;n gi&#7843;n - &#237;t step</p></li><li><p>Vi&#7871;t theo d&#7841;ng Selenium API n&#234;n kh&#244;ng c&#7847;n nhi&#7873;u k&#297; n&#259;ng l&#7853;p tr&#236;nh</p></li></ul></li><li><p><strong>Nh&#432;&#7907;c &#273;i&#7875;m:</strong></p><ul><li><p>Kh&#243; b&#7843;o tr&#236; khi c&#225;c step gi&#7889;ng nhau s&#7869; l&#7863;p l&#7841;i nhi&#7873;u l&#7847;n trong c&#225;c class kh&#225;c nhau</p><ul><li><p>Selenium API b&#7883; l&#7863;p l&#7841;i</p></li><li><p>Locator b&#7883; l&#7863;p l&#7841;i</p></li><li><p>Data test b&#7883; l&#7863;p l&#7841;i</p></li></ul></li><li><p>Kh&#244;ng ph&#249; h&#7907;p v&#7899;i nh&#7919;ng d&#7921; &#225;n ph&#7913;c t&#7841;p - nhi&#7873;u ch&#7913;c n&#259;ng</p></li><li><p>Vi ph&#7841;m <strong><a href="https://www.codehub.vn/Nguyen-Ly-DRY-Dont-Repeat-Yourself">nguy&#234;n t&#7855;c DRY</a></strong></p><ul><li><p>Nguy&#234;n t&#7855;c n&#224;y c&#243; ngh&#297;a l&#224; &#273;&#7915;ng c&#243; vi&#7871;t l&#7863;p b&#7845;t k&#7923; l&#7841;i m&#7897;t &#273;o&#7841;n m&#227; n&#224;o m&#224; h&#227;y &#273;&#243;ng g&#243;i n&#243; th&#224;nh ph&#432;&#417;ng th&#7913;c ri&#234;ng - &#273;&#7871;n khi c&#7847;n th&#236; ch&#7881; c&#7847;n g&#7885;i t&#234;n n&#243; ra</p></li></ul></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[[Framework 01] - Cấu trúc cơ bản của một Framework]]></title><description><![CDATA[Xin ch&#224;o c&#225;c b&#7841;n - &#273;&#226;y lo&#7841;t b&#224;i vi&#7871;t h&#432;&#7899;ng d&#7851;n v&#7873; Build Automation Framework.]]></description><link>https://blog.automationfc.vn/p/framework-structure</link><guid isPermaLink="false">https://blog.automationfc.vn/p/framework-structure</guid><dc:creator><![CDATA[Đào Minh Đảm]]></dc:creator><pubDate>Wed, 19 Feb 2020 17:04:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/41273145-c5f7-4f92-9bfe-b57276a095f7_820x490.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Lo&#7841;t b&#224;i vi&#7871;t h&#432;&#7899;ng d&#7851;n v&#7873; Build Automation Framework - c&#225;c b&#224;i vi&#7871;t v&#224; video chi ti&#7871;t c&#243; trong kh&#243;a h&#7885;c <a href="https://automationfc.vn/course/framework">Build Automation Framework in Java</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://automationfc.vn/course/framework&quot;,&quot;text&quot;:&quot;&#272;&#259;ng K&#253;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://automationfc.vn/course/framework"><span>&#272;&#259;ng K&#253;</span></a></p><div><hr></div><p>B&#224;i vi&#7871;t n&#224;y h&#432;&#7899;ng d&#7851;n t&#7841;o Java project v&#224; x&#226;y d&#7921;ng c&#7845;u tr&#250;c c&#7911;a 1 test automation framework - c&#225;c b&#7841;n l&#432;u &#253; r&#7857;ng 1 framework kh&#244;ng b&#243; bu&#7897;c ph&#7843;i theo style n&#224;o nh&#7845;t &#273;&#7883;nh v&#236; n&#243; c&#242;n t&#249;y thu&#7897;c v&#224;o tool/ th&#432; vi&#7879;n &#273;ang s&#7917; d&#7909;ng v&#224; ch&#7913;c n&#259;ng m&#224; d&#7921; &#225;n c&#7847;n/ kh&#7843; n&#259;ng v&#224; t&#432; duy c&#7911;a ng&#432;&#7901;i x&#226;y d&#7921;ng l&#234;n framework &#273;&#243;</p><h2><strong>Tools</strong></h2><ul><li><p><strong>Trong ph&#7841;m vi c&#225;c b&#224;i &#273;&#7847;u m&#236;nh s&#7869; h&#432;&#7899;ng d&#7851;n t&#7915; c&#417; b&#7843;n n&#234;n s&#7869; t&#7841;o d&#7921; &#225;n d&#7841;ng Java project - s&#7869; convert qa Maven project trong c&#225;c b&#224;i vi&#7871;t sau theo &#273;&#250;ng l&#7897; tr&#236;nh</strong></p></li><li><p>M&#244;i tr&#432;&#7901;ng &#7893;n &#273;&#7883;nh c&#225;c b&#7841;n &#273;&#7885;c th&#234;m v&#7873; b&#224;i vi&#7871;t n&#224;y (<a href="https://automationfc.com/2019/05/27/tuong-thich-giua-cac-version/">S&#7921; t&#432;&#417;ng th&#237;ch gi&#7919;a c&#225;c version</a>)</p><ul><li><p>Java JDK (version 1.8)</p></li><li><p>Eclipse for Java Developer</p></li><li><p>Chrome browser m&#7899;i nh&#7845;t</p></li><li><p>Chrome driver m&#7899;i nh&#7845;t</p></li><li><p>Firefox 47.0.2 ho&#7863;c m&#7899;i nh&#7845;t</p></li><li><p>Selenium 2.53.1 ho&#7863;c m&#7899;i nh&#7845;t</p></li></ul></li></ul><h2><strong>Framework structure</strong></h2><ul><li><p>Kh&#7903;i t&#7841;o 1 Java project v&#224; c&#225;c t&#7847;ng t&#432;&#417;ng &#7913;ng - t&#249;y v&#224;o ph&#7841;m vi c&#7911;a framework v&#224; c&#225;ch ng&#432;&#7901;i tri&#7875;n khai &#273;&#7863;t t&#234;n nh&#432;ng v&#7873; c&#417; b&#7843;n c&#243; th&#7875; t&#7841;o ra c&#225;c t&#7847;ng (source folder) nh&#432; sau:</p><ul><li><p><strong>testcases</strong>: ch&#7913;a c&#225;c testscript (chia nh&#7887; ra &#273;&#7875; qu&#7843;n l&#237; t&#7915; function/ module/ class)</p></li><li><p><strong>testdata</strong>: ch&#7913;a b&#7897; data test (n&#7871;u c&#243;) khi t&#225;ch ri&#234;ng ra c&#225;c external file &#273;&#7875; qu&#7843;n l&#237; (.xlsx/ .json/ .java/..)</p></li><li><p><strong>actions</strong>: ch&#7913;a c&#225;c module</p><ul><li><p>pageObjects: ch&#7913;a c&#225;c page class</p></li><li><p>commons: ch&#7913;a c&#225;c common class nh&#432; AbstractPage/ AbstractTest/ Global_Constant</p></li><li><p>reportConfig: ch&#7913;a c&#225;c class &#273;&#7875; config report html (ReportNG/ Extent Report)</p></li><li><p>...</p></li></ul></li><li><p><strong>interfaces</strong>: ch&#7913;a c&#225;c UI (User Interface) c&#7911;a c&#225;c page application - c&#7909; th&#7875; l&#224; &#273;&#7883;nh ngh&#297;a c&#225;c locator cho element trong 1 page</p></li><li><p><strong>resources</strong>: ch&#7913;a c&#225;c external config nh&#432; log.xml/ testng.xml/ .properties/...</p></li><li><p><strong>c&#225;c th&#432; m&#7909;c kh&#225;c:</strong></p><ul><li><p>libraries</p></li><li><p>browserDriver</p></li><li><p>uploadFiles</p></li><li><p>downloadFiles</p></li><li><p>screenshot</p></li><li><p>..</p></li></ul></li><li><p>Sau khi t&#7841;o xong c&#7845;u tr&#250;c hi&#7875;n th&#7883; nh&#432; th&#7871; n&#224;y l&#224; finish</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/01/2020-02-19-17_20_54-workspace-eclipse-ide.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rWxg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 424w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 848w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 1272w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rWxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png" width="616" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/01/2020-02-19-17_20_54-workspace-eclipse-ide.png&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rWxg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 424w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 848w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 1272w, https://substackcdn.com/image/fetch/$s_!rWxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e367a2-3bc9-4a19-bf5f-b97005d3f9a6_771x601.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Add libraries/ driver</strong></h2><ul><li><p>T&#7843;i th&#432; vi&#7879;n Selenium v&#224; c&#225;c browser driver v&#7873; add v&#224;o Build Path (<a href="https://automationfc.com/2019/05/27/tuong-thich-giua-cac-version/">check &#273;&#250;ng version &#273;ang c&#243; &#7903; local</a>)</p><ul><li><p>http://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.1.jar</p><ul><li><p>Copy paste v&#224;o th&#432; m&#7909;c libraries - click chu&#7897;t ph&#7843;i v&#224;o file th&#432; vi&#7879;n ch&#7885;n<strong> Build Path &gt; Add to Build Path</strong></p></li></ul></li><li><p>https://chromedriver.storage.googleapis.com/index.html?path=78.0.3904.70/</p><ul><li><p>Copy paste file chromedriver.exe v&#224;o th&#432; m&#7909;c browserDriver (l&#432;u &#253; ko add file n&#224;y v&#224;o Build Path)</p></li></ul></li></ul></li><li><p>Sau khi add v&#224;o Build Path ki&#7875;m tra c&#243; selenium trong &#273;&#243; l&#224; th&#224;nh c&#244;ng</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://daominhdam.wordpress.com/wp-content/uploads/2020/01/2020-02-19-17_21_08-workspace-eclipse-ide.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LpT1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 424w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 848w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 1272w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LpT1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png" width="616" height="591" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:591,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://daominhdam.wordpress.com/wp-content/uploads/2020/01/2020-02-19-17_21_08-workspace-eclipse-ide.png&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!LpT1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 424w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 848w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 1272w, https://substackcdn.com/image/fetch/$s_!LpT1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b9a4c3e-cca7-4979-889b-8ded7d24a1e6_698x670.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>B&#224;i sau m&#236;nh s&#7869; h&#432;&#7899;ng d&#7851;n &#273;&#7875; t&#7841;o test sample &#273;&#7847;u ti&#234;n vi&#7871;t theo level basic (step-by-step) - m&#7909;c &#273;&#237;ch &#273;&#7875; compare &#432;u/ nh&#432;&#7907;c &#273;i&#7875;m vs c&#225;c c&#225;ch vi&#7871;t kh&#225;c</p></li></ul>]]></content:encoded></item></channel></rss>