<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Michael vu - ARROW Technologies Blog]]></title><description><![CDATA[Trang tổng hợp các kiến thức về lập trình]]></description><link>https://blog.arrow-tech.vn/</link><image><url>https://blog.arrow-tech.vn/favicon.png</url><title>Michael vu - ARROW Technologies Blog</title><link>https://blog.arrow-tech.vn/</link></image><generator>Ghost 5.81</generator><lastBuildDate>Sun, 05 Apr 2026 19:39:26 GMT</lastBuildDate><atom:link href="https://blog.arrow-tech.vn/author/michael/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Oh my fish!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="1mbi">1. M&#x1EDF; b&#xE0;i</h2>
<p>C&#x1EDD; l&#x1EDD; i vs G&#x1EDD; u i (CLI vs GUI) v&#x1EAB;n lu&#xF4;n l&#xE0; cu&#x1ED9;c tranh lu&#x1EAD;n n&#xF3;ng b&#x1ECF;ng v&#xE0; d&#xE0;i h&#x1A1;i c&#x1EE7;</p>]]></description><link>https://blog.arrow-tech.vn/oh-my-fish/</link><guid isPermaLink="false">63915acd7a2f410001205d96</guid><dc:creator><![CDATA[Michael vu]]></dc:creator><pubDate>Sat, 30 Jul 2016 23:49:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="1mbi">1. M&#x1EDF; b&#xE0;i</h2>
<p>C&#x1EDD; l&#x1EDD; i vs G&#x1EDD; u i (CLI vs GUI) v&#x1EAB;n lu&#xF4;n l&#xE0; cu&#x1ED9;c tranh lu&#x1EAD;n n&#xF3;ng b&#x1ECF;ng v&#xE0; d&#xE0;i h&#x1A1;i c&#x1EE7;a ng&#x1B0;&#x1EDD;i s&#x1EED; d&#x1EE5;ng m&#xE1;y t&#xED;nh n&#xF3;i chung.<br>
Suy cho c&#xF9;ng, CLI hay GUI &#x111;&#x1EC1;u l&#xE0; m&#x1ED9;t trong s&#x1ED1; nhi&#x1EC1;u ph&#x1B0;&#x1A1;ng ph&#xE1;p giao ti&#x1EBF;p gi&#x1EEF;a 2 &#x111;&#x1ED1;i t&#x1B0;&#x1EE3;ng (&#x1EDF; &#x111;&#xE2;y l&#xE0; ng&#x1B0;&#x1EDD;i v&#xE0; m&#xE1;y). N&#x1EBF;u nh&#x1B0; gi&#x1EEF;a ng&#x1B0;&#x1EDD;i vs ng&#x1B0;&#x1EDD;i, ch&#xFA;ng ta c&#xF3; 3 ph&#x1B0;&#x1A1;ng ph&#xE1;p: <code>Speech</code>, <code>Write</code>, <code>Body language</code>. Th&#xEC; gi&#x1EEF;a ng&#x1B0;&#x1EDD;i vs m&#xE1;y, ch&#xFA;ng ta c&#x169;ng c&#xF3; 3 ph&#x1B0;&#x1A1;ng ph&#xE1;p: <code>Speech</code>, <code>Text</code>, <code>Mouse&amp;Screen</code>. Trong &#x111;&#xF3;, <code>Speech</code> l&#xE0; kh&#x1EA3; n&#x103;ng ra l&#x1EC7;nh cho m&#xE1;y b&#x1EB1;ng gi&#x1ECD;ng n&#xF3;i. <code>Text</code> l&#xE0; kh&#x1EA3; n&#x103;ng ra l&#x1EC7;nh cho m&#xE1;y b&#x1EB1;ng d&#xF2;ng l&#x1EC7;nh <code>command line</code>. <code>Mouse&amp;Screen</code> l&#xE0; kh&#x1EA3; n&#x103;ng ra l&#x1EC7;nh cho m&#xE1;y b&#x1EB1;ng c&#xE1;c thao t&#xE1;c chu&#x1ED9;t v&#xE0; m&#xE0;n h&#xEC;nh (c&#x1EA3;m &#x1EE9;ng).</p>
<p>B&#xE0;i vi&#x1EBF;t n&#xE0;y c&#xF3; m&#x1EE5;c &#x111;&#xED;ch r&#xF5; r&#xE0;ng l&#xE0; t&#xF4;n vinh CLI (Text) h&#x1A1;n l&#xE0; GUI (Mouse&amp;Screen).</p>
<h2 id="2thnbi">2. Th&#xE2;n b&#xE0;i</h2>
<h5 id="21lmquenvicli">2.1. L&#xE0;m quen v&#x1EDB;i CLI</h5>
<p>&#x110;&#x1EA7;u ti&#xEA;n h&#xE3;y t&#xEC;m cho m&#xEC;nh m&#x1ED9;t terminal &#x1B0;a th&#xED;ch. &#x110;&#xF3; s&#x1EBD; l&#xE0; th&#x1EE9; m&#xE0; b&#x1EA1;n m&#x1EDF; l&#xEA;n &#x111;&#x1EA7;u ti&#xEA;n h&#xE0;ng ng&#xE0;y, v&#xE0; l&#xE0; th&#x1EE9; m&#xE0; b&#x1EA1;n s&#x1EBD; v&#x1EAD;t l&#x1ED9;n c&#x1EA3; ng&#xE0;y. Do &#x111;&#xF3; h&#xE3;y l&#x1EF1;a ch&#x1ECD;n m&#x1ED9;t th&#x1EE9; ph&#xF9; h&#x1EE3;p v&#x1EDB;i m&#xEC;nh: &#x111;&#x1EE7; th&#xF4;ng minh &#x111;&#x1EC3; gi&#xFA;p b&#x1EA1;n, &#x111;&#x1EE7; xinh &#x111;&#x1EB9;p &#x111;&#x1EC3; kh&#xF4;ng khi&#x1EBF;n b&#x1EA1;n c&#x1EA3;m th&#x1EA5;y bu&#x1ED3;n ch&#xE1;n khi nh&#xEC;n n&#xF3; c&#x1EA3; ng&#xE0;y.</p>
<p>Khuy&#x1EBF;n c&#xE1;o c&#x1EE7;a t&#xF4;i l&#xE0; <a href="https://www.iterm2.com/downloads.html?ref=blog.arrow-tech.vn">iTerm2</a> (hi&#x1EC7;n &#x111;&#xE3; c&#xF3; version 3). Ti&#x1EBF;c c&#xE1;i l&#xE0; ch&#x1EC9; c&#xF3; cho Mac. V&#x1EDB;i ubuntu th&#xEC; c&#xF3; nhi&#x1EC1;u terminal, nh&#x1B0;ng c&#xE1;i n&#xE0;o t&#x1ED1;t nh&#x1EA5;t th&#xEC; t&#xF4;i kh&#xF4;ng ch&#x1EAF;c.</p>
<p>D&#xF9; sao th&#xEC; &#x111;&#xE2;y c&#x169;ng ch&#x1EC9; l&#xE0; ph&#x1EA7;n b&#x1EC1; ngo&#xE0;i, quan tr&#x1ECD;ng l&#xE0; ch&#xFA;ng ta d&#xF9;ng shell g&#xEC;.</p>
<p><code>Shell</code> l&#xE0; g&#xEC;?<br>
theo <a href="https://en.wikipedia.org/wiki/Unix_shell?ref=blog.arrow-tech.vn">Wiki</a>, th&#xEC; Shell l&#xE0; c&#xE1;i s&#x1EBD; nh&#x1EAD;n, c&#x1ED1; g&#x1EAF;ng hi&#x1EC3;u xem b&#x1EA1;n &#x111;ang mu&#x1ED1;n l&#xE0;m g&#xEC; v&#xE0; th&#x1EF1;c hi&#x1EC7;n n&#xF3;.</p>
<p>T&#xF4;i &#x111;&#xE3; d&#xF9;ng qua <code>bash</code>, <code>sh</code> v&#xE0; gi&#x1EDD; l&#xE0; <code>fish</code>. T&#x1EEB; khi d&#xF9;ng <code>fish</code> th&#xEC; th&#x1EF1;c s&#x1EF1; l&#xE0; t&#xF4;i kh&#xF4;ng ngh&#x129; &#x111;&#x1EBF;n vi&#x1EC7;c quay l&#x1EA1;i d&#xF9;ng c&#xE1;c shell kia n&#x1EEF;a.</p>
<h5 id="22gpfish">2.2. G&#x1EB7;p <code>fish</code></h5>
<p>B&#x1EA1;n c&#xF3; th&#x1EC3; c&#xE0;i <a href="http://fishshell.com/?ref=blog.arrow-tech.vn">fish</a> <a href="http://fishshell.com/?ref=blog.arrow-tech.vn">&#x1EDF; &#x111;&#xE2;y</a></p>
<p>&#x1EA4;n t&#x1B0;&#x1EE3;ng l&#x1EDB;n nh&#x1EA5;t c&#x1EE7;a t&#xF4;i &#x111;&#x1ED1;i v&#x1EDB;i <code>fish</code> &#x111;&#xF3; l&#xE0; kh&#x1EA3; n&#x103;ng g&#x1EE3;i &#xFD; l&#x1EC7;nh v&#xE0; kh&#x1EA3; n&#x103;ng c&#xE0;i &#x111;&#x1EB7;t custom function.</p>
<h6 id="221gilnhautosuggestion">2.2.1. G&#x1EE3;i &#xFD; l&#x1EC7;nh (Auto suggestion)</h6>
<p>&#x110;&#xFA;ng nh&#x1B0; &#x111;&#x1B0;&#x1EE3;c &apos;ch&#xE9;m&apos; &#x1EDF; trang ch&#x1EE7; c&#x1EE7;a m&#xEC;nh, <code>fish</code> g&#x1EE3;i &#xFD; l&#x1EC7;nh d&#x1EF1;a tr&#xEA;n l&#x1ECB;ch s&#x1EED; l&#x1EC7;nh &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c d&#xF9;ng, k&#x1EBF;t h&#x1EE3;p v&#x1EDB;i nh&#x1EEF;ng g&#xEC; b&#x1EA1;n &#x111;ang g&#xF5;.<br>
Nh&#x1B0;ng kh&#xF4;ng ch&#x1EC9; c&#xF3; th&#x1EBF;, kh&#x1EA3; n&#x103;ng th&#x1EF1;c s&#x1EF1; c&#x1EE7;a fish n&#x1EB1;m &#x1EDF; ph&#xED;m <code>tab</code>, g&#x1ECD;i l&#xE0; Tab completion.</p>
<p>Tab completion c&#xF3; m&#x1ED9;t v&#xE0;i ch&#x1EE9;c n&#x103;ng. &#x110;&#x1EA7;u ti&#xEA;n l&#xE0; Auto completion, khi b&#x1EA1;n g&#xF5; 1 v&#xE0;i ch&#x1EEF; c&#xE1;i &#x111;&#x1EA7;u c&#x1EE7;a l&#x1EC7;nh, &#x1EA5;n Tab ngh&#x129;a l&#xE0; b&#x1EA1;n y&#xEA;u c&#x1EA7;u fish &#x111;o&#xE1;n xem b&#x1EA1;n &#x111;ang mu&#x1ED1;n l&#xE0;m g&#xEC;. N&#x1EBF;u &#x111;&#x1EE7; th&#xF4;ng tin, th&#xEC; fish s&#x1EBD; t&#x1EF1; &#x111;&#x1ED9;ng ho&#xE0;n th&#xE0;nh n&#x1ED1;t d&#xF2;ng l&#x1EC7;nh &#x111;&#xF3;, n&#x1EBF;u kh&#xF4;ng fish s&#x1EBD; &#x111;&#x1B0;a ra cho b&#x1EA1;n nh&#x1EEF;ng kh&#x1EA3; n&#x103;ng ph&#xF9; h&#x1EE3;p nh&#x1EA5;t v&#x1EDB;i nh&#x1EEF;ng g&#xEC; b&#x1EA1;n &#x111;&#xE3; g&#xF5;. V&#xE0; vi&#x1EC7;c c&#x1EE7;a b&#x1EA1;n l&#xE0; l&#x1EF1;a ch&#x1ECD;n. Kh&#xF4;ng c&#x1EA7;n nh&#x1EA5;c tay ra c&#x1EA7;m chu&#x1ED9;t, ch&#x1EC9; &#x111;&#x1A1;n gi&#x1EA3;n l&#xE0; tab ti&#x1EBF;p v&#xE0; enter.<br>
<img src="https://blog.arrow-tech.vn/content/images/2016/07/1____test___fish__fish_.png" alt loading="lazy"></p>
<p>B&#xEA;n c&#x1EA1;nh nh&#x1EEF;ng l&#x1EC7;nh c&#xF3; s&#x1EB5;n c&#x1EE7;a unix, fish c&#x169;ng h&#x1ED7; tr&#x1EE3; th&#xEA;m r&#x1EA5;t nhi&#x1EC1;u l&#x1EC7;nh c&#x1EE7;a c&#xE1;c th&#x1B0; vi&#x1EC7;n ph&#x1ED5; bi&#x1EBF;n kh&#xE1;c. Kh&#x1EA3; n&#x103;ng h&#x1ED7; tr&#x1EE3; c&#x1EE7;a fish l&#xE0; t&#x1EF1; &#x111;&#x1ED9;ng t&#xEC;m v&#xE0; &#x111;&#x1B0;a ra c&#xE1;c option c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng v&#x1EDB;i l&#x1EC7;nh t&#x1B0;&#x1A1;ng &#x1EE9;ng. V&#xED; d&#x1EE5; v&#x1EDB;i docker, ngo&#xE0;i vi&#x1EC7;c g&#x1EE3;i &#xFD; c&#xE1;c command:<br>
<img src="https://blog.arrow-tech.vn/content/images/2016/07/1______fish__fish_-1.png" alt loading="lazy"></p>
<p>fish c&#xF2;n c&#xF3; th&#x1EC3; g&#x1EE3;i &#xFD; d&#x1EF1;a tr&#xEA;n danh s&#xE1;ch container hi&#x1EC7;n c&#xF3;:</p>
<p><img src="https://blog.arrow-tech.vn/content/images/2016/07/1______fish__fish_-2.png" alt loading="lazy"></p>
<h6 id="222customfunction">2.2.2. Custom function</h6>
<p>N&#x1EBF;u nh&#x1B0; b&#x1EA1;n c&#xF3; nhi&#x1EC1;u c&#xF4;ng vi&#x1EC7;c l&#x1EB7;p &#x111;i l&#x1EB7;p l&#x1EA1;i, b&#x1EA1;n c&#xF3; th&#x1EC3; t&#x1EF1; t&#x1EA1;o cho m&#xEC;nh m&#x1ED9;t function &#x111;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n t&#x1EA5;t c&#x1EA3; nh&#x1EEF;ng vi&#x1EC7;c &#x111;&#xF3;. Fish cho ph&#xE9;p b&#x1EA1;n l&#xE0;m vi&#x1EC7;c &#x111;&#xF3; b&#x1EB1;ng nhi&#x1EC1;u c&#xE1;ch.<br>
V&#x1EDB;i c&#xE1;c l&#x1EC7;nh &#x111;&#x1A1;n gi&#x1EA3;n, v&#xED; d&#x1EE5; <code>ls -la</code>, b&#x1EA1;n kh&#xF4;ng mu&#x1ED1;n m&#x1ED7;i l&#x1EA7;n xem th&#x1B0; m&#x1EE5;c l&#x1EA1;i ph&#x1EA3;i g&#xF5; &#x111;i g&#xF5; l&#x1EA1;i nh&#x1EEF;ng ch&#x1EEF; &#x111;&#xF3;. Cho d&#xF9;ng t&#xED;nh n&#x103;ng Auto completion &#x111;&#xE3; gi&#xFA;p b&#x1EA1;n ph&#x1EA7;n n&#xE0;o, nh&#x1B0;ng... v&#x1EAB;n c&#xF2;n c&#xF3; c&#xE1;ch t&#x1ED1;t h&#x1A1;n. &#x110;&#xF3; l&#xE0;:</p>
<p><code>alias l &quot;ls -la&quot;</code></p>
<p>V&#x1EDB;i l&#x1EC7;nh n&#xE0;y, b&#x1EA1;n th&#xF4;ng b&#xE1;o v&#x1EDB;i fish r&#x1EB1;ng: &quot;t&#x1EEB; gi&#x1EDD; tr&#x1EDF; &#x111;i, m&#x1ED7;i khi anh g&#xF5; <code>l</code> th&#xEC; em h&#xE3;y hi&#x1EC3;u l&#xE0; anh mu&#x1ED1;n <code>ls -la</code> nh&#xE9;&quot;.<br>
V&#xE0; gi&#x1EDD; b&#x1EA1;n ch&#x1EC9; c&#x1EA7;n <code>l</code> th&#xF4;i.<br>
<img src="https://blog.arrow-tech.vn/content/images/2016/07/1____test___fish__fish_-1.png" alt loading="lazy"></p>
<p>V&#x1EDB;i nh&#x1EEF;ng l&#x1EC7;nh ph&#x1EE9;c t&#x1EA1;p h&#x1A1;n, b&#x1EA1;n c&#x1EA7;n ph&#x1EA3;i t&#x1EA1;o 1 file m&#xF4; t&#x1EA3; function trong th&#x1B0; m&#x1EE5;c <code>~/.config/fish/functions/</code></p>
<h4 id="23ngdng">2.3. &#x1EE8;ng d&#x1EE5;ng</h4>
<p>Ph&#x1EA7;n n&#xE0;y s&#x1EBD; t&#x1EAD;p h&#x1EE3;p c&#xE1;c m&#x1EB9;o v&#x1EB7;t s&#x1EED; d&#x1EE5;ng CLI</p>
<h6 id="231dichuynqualigiaccthmc">2.3.1. Di chuy&#x1EC3;n qua l&#x1EA1;i gi&#x1EEF;a c&#xE1;c th&#x1B0; m&#x1EE5;c</h6>
<p>M&#x1ED9;t trong nh&#x1EEF;ng &#x111;i&#x1EC1;u phi&#x1EC1;n ph&#x1EE9;c nh&#x1EA5;t khi s&#x1EED; d&#x1EE5;ng CLI &#x111;&#xF3; l&#xE0; di chuy&#x1EC3;n qua l&#x1EA1;i c&#xE1;c th&#x1B0; m&#x1EE5;c kh&#xE1;c nhau. &#x110;&#x1EB7;c bi&#x1EC7;t l&#xE0; sau khi ng&#x1EE5;p l&#x1EB7;n v&#xE0;o c&#xE1;c th&#x1B0; m&#x1EE5;c r&#x1EA5;t s&#xE2;u. B&#x1EA1;n c&#xF3; th&#x1EC3; s&#x1EED; d&#x1EE5;ng <code>cd -</code> c&#xF3; s&#x1EB5;n &#x111;&#x1EC3; di chuy&#x1EC3;n nhanh v&#x1EC1; th&#x1B0; m&#x1EE5;c ngay tr&#x1B0;&#x1EDB;c &#x111;&#xF3;, nh&#x1B0;ng c&#x169;ng ch&#x1B0;a ti&#x1EC7;n h&#x1A1;n l&#xE0; m&#x1EA5;y.</p>
<p><code>z</code>(<a href="https://github.com/sjl/z-fish?ref=blog.arrow-tech.vn">xem t&#x1EA1;i &#x111;&#xE2;y</a>) l&#xE0; 1 ti&#x1EC7;n &#xED;ch khi&#x1EBF;n cho b&#x1EA1;n c&#x1EA3;m th&#x1EA5;y m&#xEC;nh nh&#x1B0; m&#x1ED9;t jumper th&#x1EF1;c s&#x1EF1; b&#x1EB1;ng c&#xE1;ch cho ph&#xE9;p b&#x1EA1;n d&#x1ECB;ch chuy&#x1EC3;n t&#x1EE9;c th&#x1EDD;i &#x111;&#x1EBF;n 1 th&#x1B0; m&#x1EE5;c d&#x1EF1;a tr&#xEA;n m&#x1ED9;t ph&#x1EA7;n t&#xEA;n c&#x1EE7;a th&#x1B0; m&#x1EE5;c &#x111;&#xF3;.<br>
V&#xED; d&#x1EE5;, tr&#x1B0;&#x1EDB;c &#x111;&#xF3; b&#x1EA1;n &#x111;&#xE3; v&#xE0;o th&#x1B0; m&#x1EE5;c project c&#x1EE7;a m&#xEC;nh b&#x1EB1;ng l&#x1EC7;nh<br>
<code>cd /Volumes/Data/working/projects/customer/projectA</code><br>
, r&#x1ED3;i sau &#x111;&#xF3; b&#x1EA1;n ph&#x1EA3;i qua check config c&#x1EE7;a nginx</p>
<p><code>cd /usr/local/opt/nginx</code></p>
<p>v&#xE0; &#x111;i &#x111;&#x1EBF;n 1 lo&#x1EA1;t c&#xE1;c th&#x1B0; m&#x1EE5;c kh&#xE1;c n&#x1EEF;a. V&#xE0; gi&#x1EDD; b&#x1EA1;n mu&#x1ED1;n tr&#x1EDF; l&#x1EA1;i projectA. <code>cd</code> n&#x1EEF;a &#x1B0;? Kh&#xF4;ng, h&#xE3;y nh&#x1EA3;y &#x111;&#x1EBF;n &#x111;&#xF3;:</p>
<p><code>z projectA</code></p>
<p>ngay l&#x1EAD;p t&#x1EE9;c b&#x1EA1;n s&#x1EBD; c&#xF3; m&#x1EB7;t t&#x1EA1;i th&#x1B0; m&#x1EE5;c projectA, magic!!!</p>
<p>C&#xF3; 1 ch&#xFA; &#xFD; l&#xE0;, &#x111;&#x1EC3; nh&#x1EA3;y &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1EBF;n th&#x1B0; m&#x1EE5;c n&#xE0;o &#x111;&#xF3;, th&#xEC; b&#x1EA1;n ph&#x1EA3;i &#xED;t nh&#x1EA5;t 1 l&#x1EA7;n <code>cd</code> &#x111;&#x1EBF;n th&#x1B0; m&#x1EE5;c &#x111;&#xF3; &#x111;&#xE3;.</p>
<h6 id="232gitutils">2.3.2. Git utils</h6>
<p>L&#xE0;m vi&#x1EC7;c v&#x1EDB;i git nhi&#x1EC1;u, b&#x1EA1;n s&#x1EBD; c&#x1EA7;n m&#x1ED9;t s&#x1ED1; utils b&#x1ED5; tr&#x1EE3;. V&#xED; d&#x1EE5;, khi b&#x1EAF;t &#x111;&#x1EA7;u 1 project m&#x1EDB;i, b&#x1EA1;n c&#x1EA7;n ph&#x1EA3;i kh&#x1EDF;i t&#x1EA1;o repository. C&#xF4;ng vi&#x1EC7;c c&#x1EA7;n l&#xE0;m l&#xE0;:</p>
<ul>
<li><code>git init</code></li>
<li><code>git add .</code></li>
<li><code>git commit -m &quot;First commit&quot;</code></li>
</ul>
<p>M&#x1EC7;t h&#x1EA3;? <code>git-extras</code> s&#x1EBD; gi&#xFA;p b&#x1EA1;n (<a href="https://github.com/sjl/z-fish?ref=blog.arrow-tech.vn">Xem &#x1EDF; &#x111;&#xE2;y</a>). Sau khi c&#xE0;i &#x111;&#x1EB7;t, c&#xF4;ng vi&#x1EC7;c c&#x1EE7;a b&#x1EA1;n s&#x1EBD; l&#xE0;:</p>
<ul>
<li><code>git setup</code></li>
</ul>
<p>Xong r&#x1ED3;i. Nhanh qu&#xE1; nh&#x1EC9;?</p>
<p>R&#x1ED3;i khi b&#x1EA1;n c&#x1EA7;n revert l&#x1EA1;i 3 commit v&#x1EEB;a xong. Thay v&#xEC;:</p>
<ul>
<li><code>git revert HEAD~3..HEAD</code></li>
<li><code>git commit -m &quot;em revert l&#x1EA1;i v&#xEC; em nh&#x1EA7;m &#x1EA1;&quot;</code></li>
</ul>
<p>b&#x1EA1;n c&#xF3; th&#x1EC3; d&#xF9;ng:</p>
<ul>
<li><code>git undo 3</code></li>
</ul>
<p>Done.</p>
<p>M&#x1ED9;t tr&#x1B0;&#x1EDD;ng h&#x1EE3;p c&#x169;ng hay g&#x1EB7;p, &#x111;&#xF3; l&#xE0; b&#x1EA1;n commit 1 change trong nhi&#x1EC1;u l&#x1EA7;n commit, gi&#x1EDD; mu&#x1ED1;n g&#x1ED9;p l&#x1EA1;i th&#xE0;nh 1 commit th&#xF4;i &#x111;&#x1EC3; history d&#x1EC5; nh&#xEC;n h&#x1A1;n. L&#xE0;m n&#xE0;o khi m&#xE0; m&#xEC;nh &#x111;&#xE3; commit xong xu&#xF4;i h&#x1EBF;t r&#x1ED3;i?</p>
<ul>
<li><code>git squash HEAD~3</code></li>
</ul>
<p>s&#x1EBD; gi&#xFA;p b&#x1EA1;n g&#x1ED9;p 3 commit g&#x1EA7;n nh&#x1EA5;t l&#x1EA1;i th&#xE0;nh 1.</p>
<h6 id="233cnna">2.3.3. C&#xF2;n n&#x1EEF;a</h6>
<p>C&#xF2;n nhi&#x1EC1;u tip kh&#xE1;c n&#x1EEF;a, s&#x1EBD; thu th&#x1EAD;p ti&#x1EBF;p v&#xE0; update ti&#x1EBF;p...</p>
<h2 id="3ktbi">3. K&#x1EBF;t b&#xE0;i</h2>
<p>X&#xE9;t m&#x1ED9;t c&#xE1;ch to&#xE0;n di&#x1EC7;n, m&#x1EE5;c ti&#xEA;u c&#x1EE7;a giao ti&#x1EBF;p lu&#xF4;n l&#xE0; s&#x1EF1; hi&#x1EC3;u l&#x1EAB;n nhau. N&#x1EBF;u nh&#xEC;n v&#xE0;o s&#x1EF1; giao ti&#x1EBF;p c&#x1EE7;a ng&#x1B0;&#x1EDD;i vs ng&#x1B0;&#x1EDD;i ng&#xE0;y nay, t&#xF4;i th&#x1EA5;y n&#x1EBF;u so s&#xE1;nh c&#xE1;c ph&#x1B0;&#x1A1;ng ph&#xE1;p giao ti&#x1EBF;p theo ti&#xEA;u ch&#xED; l&#xE0; s&#x1EF1; hi&#x1EC7;u qu&#x1EA3;, th&#xEC; th&#x1EE9; t&#x1EF1; nh&#x1B0; sau:</p>
<p><code>Speech &gt; Write &gt; Body language</code></p>
<p>Ch&#xFA;ng ta lu&#xF4;n mu&#x1ED1;n m&#xE1;y t&#xED;nh c&#xF3; th&#x1EC3; hi&#x1EC3;u &#x111;&#x1B0;&#x1EE3;c con ng&#x1B0;&#x1EDD;i, th&#xEC; c&#xF3; l&#x1EBD; &#x111;&#xE3; &#x111;&#x1EBF;n l&#xFA;c xem x&#xE9;t giao ti&#x1EBF;p ng&#x1B0;&#x1EDD;i vs m&#xE1;y gi&#x1ED1;ng nh&#x1B0; giao ti&#x1EBF;p ng&#x1B0;&#x1EDD;i vs ng&#x1B0;&#x1EDD;i.  &#x110;&#x1EC3; ng&#x1B0;&#x1EDD;i nghe c&#xF3; th&#x1EC3; hi&#x1EC3;u &#x111;&#x1B0;&#x1EE3;c m&#xEC;nh, t&#x1ED1;t nh&#x1EA5;t l&#xE0; d&#xF9;ng Speech, ti&#x1EBF;p &#x111;&#x1EBF;n l&#xE0; Write/Text (CLI) v&#xE0; cu&#x1ED1;i c&#xF9;ng  m&#x1EDB;i l&#xE0; Body language (GUI).</p>
<p>N&#x1EBF;u v&#xED; m&#xE1;y t&#xED;nh nh&#x1B0; m&#x1ED9;t c&#xF4; g&#xE1;i m&#xE0; b&#x1EA1;n mu&#x1ED1;n chinh ph&#x1EE5;c (t&#x1EA1;i th&#x1EDD;i &#x111;i&#x1EC3;m hi&#x1EC7;n t&#x1EA1;i th&#xEC; h&#xE3;y coi nh&#x1B0; c&#xF4; &#x1EA5;y kh&#xF4;ng th&#x1EC3; nghe th&#x1EA5;y b&#x1EA1;n (: ), t&#xF4;i th&#x1EF1;c s&#x1EF1; khuy&#xEA;n b&#x1EA1;n h&#xE3;y vi&#x1EBF;t (CLI) cho c&#xF4; &#x1EA5;y. Kh&#xF4;ng ch&#x1EC9; l&#xE0; s&#x1EBD; hi&#x1EC7;u qu&#x1EA3; h&#x1A1;n m&#xE0; c&#xF2;n an to&#xE0;n h&#x1A1;n nhi&#x1EC1;u so v&#x1EDB;i vi&#x1EC7;c ch&#x1EC9; s&#x1EDD;, ch&#x1EA1;m v&#xE0; nh&#x1EA5;p (touch, tap, click - GUI) v&#xE0;o c&#xF4; &#x1EA5;y.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Giới thiệu về kiểm thử hộp trắng (Whitebox testing)]]></title><description><![CDATA[Kiểm thử dựa trên source code, thuật toán (algorithm)]]></description><link>https://blog.arrow-tech.vn/gioi-thieu-ve-kiem-thu-hop-trang-whitebox-testing/</link><guid isPermaLink="false">63915acd7a2f410001205d97</guid><category><![CDATA[Testing]]></category><category><![CDATA[WhiteboxTest]]></category><dc:creator><![CDATA[Michael vu]]></dc:creator><pubDate>Mon, 18 Jul 2016 22:43:00 GMT</pubDate><media:content url="https://blog.arrow-tech.vn/content/images/2018/01/white-box-testing.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="khinim">Kh&#xE1;i ni&#x1EC7;m</h1>
<img src="https://blog.arrow-tech.vn/content/images/2018/01/white-box-testing.png" alt="Gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (Whitebox testing)"><p>Ki&#x1EC3;m th&#x1EED; d&#x1EF1;a tr&#xEA;n source code, thu&#x1EAD;t to&#xE1;n (algorithm)</p>
<h1 id="cim">&#x110;&#x1EB7;c &#x111;i&#x1EC3;m</h1>
<ul>
<li>Ng&#x1B0;&#x1EDD;i test ph&#x1EA3;i c&#xF3; ki&#x1EBF;n th&#x1EE9;c v&#x1EC1; source code, thu&#x1EAD;t to&#xE1;n &#x111;&#x1EC3; hi&#x1EC3;u</li>
<li>&#x110;&#xF2;i h&#x1ECF;i nhi&#x1EC1;u effort &#x111;&#x1EC3; th&#x1EF1;c hi&#x1EC7;n &#x111;&#x1EA7;y &#x111;&#x1EE7;.</li>
<li>Do test case &#x111;&#x1B0;&#x1EE3;c x&#xE2;y d&#x1EF1;ng d&#x1EF1;a tr&#xEA;n source code v&#xE0; thu&#x1EAD;t to&#xE1;n, nh&#x1EEF;ng case ch&#x1B0;a &#x111;&#x1B0;&#x1EE3;c x&#x1EED; l&#xFD; b&#x1EDF;i source code t&#x1EA5;t nhi&#xEA;n c&#x169;ng s&#x1EBD; kh&#xF4;ng &#x111;&#x1B0;&#x1EE3;c ki&#x1EC3;m tra. Ngh&#x129;a l&#xE0; kh&#xF4;ng ph&#xE1;t hi&#x1EC7;n ra &#x111;&#x1B0;&#x1EE3;c c&#xE1;c case b&#x1ECB; lack.</li>
<li>C&#xF3; kh&#x1EA3; n&#x103;ng b&#x1ECF; qua nh&#x1EEF;ng case l&#x1ED7;i do d&#x1EEF; li&#x1EC7;u. V&#xED; d&#x1EE5; l&#x1ED7;i chia 0.</li>
</ul>
<p>Whitebox test s&#x1EED; d&#x1EE5;ng 2 k&#x1EF9; thu&#x1EAD;t ch&#xED;nh l&#xE0; Ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng x&#x1EED; l&#xFD; (<code>Control flow testing</code>) v&#xE0; ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u (<code>Data flow testing</code>)</p>
<h3 id="kimthlungiukhincontrolflowtesting">Ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng &#x111;i&#x1EC1;u khi&#x1EC3;n (<code>Control flow Testing</code>)</h3>
<p>D&#x1EF1;a tr&#xEA;n vi&#x1EC7;c li&#x1EC7;t k&#xEA; v&#xE0; ki&#x1EC3;m th&#x1EED; c&#xE1;c lu&#x1ED3;ng th&#x1EF1;c thi (<code>Execution path</code>) c&#xF3; th&#x1EC3; c&#xF3; c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;. 1 Lu&#x1ED3;ng th&#x1EF1;c thi l&#xE0; m&#x1ED9;t danh s&#xE1;ch c&#xF3; th&#x1EE9; t&#x1EF1; c&#x1EE7;a c&#xE1;c l&#x1EC7;nh &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c hi&#x1EC7;n trong 1 l&#x1EA7;n ch&#x1EA1;y c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;, t&#x1EEB; l&#xFA;c b&#x1EAF;t &#x111;&#x1EA7;u cho &#x111;&#x1EBF;n khi k&#x1EBF;t th&#xFA;c c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;.</p>
<p>&#x110;&#x1EC3; x&#xE1;c &#x111;&#x1ECB;nh c&#xE1;c lu&#x1ED3;ng th&#x1EF1;c thi k&#x1EF9; thu&#x1EAD;t &#x110;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng th&#x1EF1;c thi (<code>Control flow Graph</code>) th&#x1B0;&#x1EDD;ng &#x111;&#x1B0;&#x1EE3;c s&#x1EED; d&#x1EE5;ng.</p>
<p>Tuy nhi&#xEA;n, s&#x1ED1; l&#x1B0;&#x1EE3;ng lu&#x1ED3;ng th&#x1EF1;c thi th&#x1B0;&#x1EDD;ng r&#x1EA5;t l&#x1EDB;n k&#x1EC3; c&#x1EA3; v&#x1EDB;i nh&#x1EEF;ng &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED; &#x111;&#x1A1;n gi&#x1EA3;n, cho n&#xEA;n g&#x1EA7;n nh&#x1B0; kh&#xF4;ng bao gi&#x1EDD; th&#x1EF1;c hi&#x1EC7;n &#x111;&#x1EA7;y &#x111;&#x1EE7; &#x111;&#x1B0;&#x1EE3;c ph&#x1B0;&#x1A1;ng ph&#xE1;p ki&#x1EC3;m th&#x1EED; n&#xE0;y.<br>
Thay v&#xE0;o &#x111;&#xF3;, m&#x1EE9;c &#x111;&#x1ED9; tin c&#x1EAD;y c&#x1EE7;a ki&#x1EC3;m th&#x1EED; &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh d&#x1EF1;a tr&#xEA;n m&#x1EE9;c &#x111;&#x1ED9; che ph&#x1EE7; c&#x1EE7;a ki&#x1EC3;m th&#x1EED; (<code>Test coverage</code>).</p>
<p>M&#x1EE9;c &#x111;&#x1ED9; che ph&#x1EE7; (<code>Test coverage</code>) l&#xE0; t&#x1EC9; l&#x1EC7; gi&#x1EEF;a s&#x1ED1; th&#xE0;nh ph&#x1EA7;n &#x111;&#xE3; &#x111;&#x1B0;&#x1EE3;c ki&#x1EC3;m th&#x1EED; tr&#xEA;n t&#x1ED5;ng s&#x1ED1; c&#xE1;c th&#xE0;nh ph&#x1EA7;n c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;.</p>
<h5 id="thlungthcthicontrolflowgraph">&#x110;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng th&#x1EF1;c thi (<code>Control flow Graph</code>)</h5>
<p>&#x110;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng th&#x1EF1;c thi &#x111;&#x1B0;&#x1EE3;c x&#xE2;y d&#x1EF1;ng b&#x1EB1;ng c&#xE1;ch m&#xF4; h&#xEC;nh h&#xF3;a source code/thu&#x1EAD;t to&#xE1;n c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED; d&#x1B0;&#x1EDB;i d&#x1EA1;ng &#x111;&#x1ED3; th&#x1ECB;. Trong &#x111;&#xF3; m&#x1ED7;i lo&#x1EA1;i l&#x1EC7;nh &#x111;&#x1B0;&#x1EE3;c m&#xF4; t&#x1EA3; b&#x1EB1;ng c&#xFA; ph&#xE1;p ri&#xEA;ng, g&#x1ED3;m c&#xF3;:</p>
<ul>
<li>&#x110;i&#x1EC3;m xu&#x1EA5;t ph&#xE1;t (<code>Entry point</code>)</li>
<li>Kh&#x1ED1;i x&#x1EED; l&#xFD; (<code>Process Block</code>)</li>
<li>&#x110;i&#x1EC3;m quy&#x1EBF;t &#x111;&#x1ECB;nh (<code>Decision Point</code>)</li>
<li>&#x110;i&#x1EC3;m n&#x1ED1;i (<code>Junction Point</code>)</li>
<li>&#x110;i&#x1EC3;m k&#x1EBF;t th&#xFA;c (<code>End Point</code>)</li>
</ul>
<p><img src="https://blog.arrow-tech.vn/content/images/2016/07/Microsoft_Word_-_Chuong03_doc_-_Chuong03_pdf.png" alt="Gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (Whitebox testing)" loading="lazy"></p>
<p>Bi&#x1EC5;u di&#x1EC5;n c&#xE1;c &#x111;i&#x1EC1;u khi&#x1EC3;n c&#x1A1; b&#x1EA3;n:<br>
<img src="http://cdn.guru99.com/images/2(1).png" alt="Gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (Whitebox testing)" loading="lazy"></p>
<p>Bi&#x1EC3;u di&#x1EC5;n 1 &#x111;o&#x1EA1;n code &#x111;&#x1A1;n gi&#x1EA3;n</p>
<p><img src="http://image.slidesharecdn.com/whiteboxtesting-160629032409/95/white-box-testing-control-flow-testing-data-flow-testing-52-638.jpg?cb=1467170732" alt="Gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (Whitebox testing)" loading="lazy"></p>
<p>M&#x1ED7;i &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng th&#x1EF1;c thi cho ph&#xE9;p x&#xE1;c &#x111;&#x1ECB;nh m&#x1EE9;c &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p c&#x1EE7;a &#x111;&#x1ED3; th&#x1ECB; (<code>Cyclomatic</code>). &#x110;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p &#x111;&#x1B0;&#x1EE3;c t&#xED;nh theo c&#xF4;ng th&#x1EE9;c sau:</p>
<ul>
<li>V(G) = E - N + 2 v&#x1EDB;i E l&#xE0; s&#x1ED1; cung, N l&#xE0; s&#x1ED1; n&#xFA;t<br>
ho&#x1EB7;c</li>
<li>V(G) = P + 1, n&#x1EBF;u &#x111;&#x1ED3; th&#x1ECB; ch&#x1EC9; ch&#x1EE9;a c&#xE1;c &#x111;i&#x1EC3;m quy&#x1EBF;t &#x111;&#x1ECB;nh (<code>Decision Point</code>), v&#xE0; P l&#xE0; s&#x1ED1; &#x111;i&#x1EC3;m quy&#x1EBF;t &#x111;&#x1ECB;nh.</li>
</ul>
<p>V&#x1EC1; l&#xFD; thuy&#x1EBF;t, khi th&#x1EF1;c hi&#x1EC7;n ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng &#x111;i&#x1EC1;u khi&#x1EC3;n, c&#x1EA7;n th&#x1EF1;c hi&#x1EC7;n theo c&#xE1;c b&#x1B0;&#x1EDB;c:</p>
<ul>
<li>D&#x1EF1;ng &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng th&#x1EF1;c thi</li>
<li>X&#xE1;c &#x111;&#x1ECB;nh &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p c&#x1EE7;a &#x111;&#x1ED3; th&#x1ECB; (gi&#x1EA3; s&#x1EED; l&#xE0; C)</li>
<li>X&#xE1;c &#x111;&#x1ECB;nh &#x111;&#xFA;ng C lu&#x1ED3;ng th&#x1EF1;c thi &#x111;&#x1ED9;c l&#x1EAD;p.</li>
<li>X&#xE2;y d&#x1EF1;ng test case cho C lu&#x1ED3;ng th&#x1EF1;c thi</li>
<li>Ki&#x1EC3;m th&#x1EED;</li>
</ul>
<p>Ph&#x1B0;&#x1A1;ng ph&#xE1;p &#x111;&#x1EC3; x&#xE1;c &#x111;&#x1ECB;nh c&#xE1;c lu&#x1ED3;ng th&#x1EF1;c thi &#x111;&#x1ED9;c l&#x1EAD;p nh&#x1B0; sau:</p>
<ul>
<li>X&#xE1;c &#x111;&#x1ECB;nh &#x111;&#x1B0;&#x1EDD;ng c&#x1A1; b&#x1EA3;n, th&#x1B0;&#x1EDD;ng l&#xE0; &#x111;&#x1B0;&#x1EDD;ng th&#x1EF1;c thi th&#x1B0;&#x1EDD;ng xuy&#xEA;n nh&#x1EA5;t</li>
<li>&#x110;&#x1EC3; ch&#x1ECD;n &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1B0;&#x1EDD;ng th&#x1EE9; 2, thay &#x111;&#x1ED5;i cung xu&#x1EA5;t ph&#xE1;t c&#x1EE7;a n&#xFA;t quy&#x1EBF;t &#x111;&#x1ECB;nh &#x111;&#x1EA7;u ti&#xEA;n v&#xE0; c&#x1ED1; g&#x1EAF;ng gi&#x1EEF; l&#x1EA1;i t&#x1ED1;i &#x111;a ph&#x1EA7;n c&#xF2;n l&#x1EA1;i.</li>
<li>&#x110;&#x1EC3; ch&#x1ECD;n &#x111;&#x1B0;&#x1EE3;c &#x111;&#x1B0;&#x1EDD;ng th&#x1EE9; 3, thay &#x111;&#x1ED5;i cung xu&#x1EA5;t ph&#xE1;t c&#x1EE7;a n&#xFA;t quy&#x1EBF;t &#x111;&#x1ECB;nh th&#x1EE9; 2 v&#xE0; c&#x1ED1; g&#x1EAF;ng gi&#x1EEF;a l&#x1EA1;i t&#x1ED1;i &#x111;a ph&#x1EA7;n c&#xF2;n l&#x1EA1;i</li>
<li>L&#x1EB7;p l&#x1EA1;i v&#x1EDB;i c&#xE1;c n&#xFA;t quy&#x1EBF;t &#x111;&#x1ECB;nh ti&#x1EBF;p theo cho &#x111;&#x1EBF;n khi kh&#xF4;ng c&#xF2;n n&#xFA;t quy&#x1EBF;t &#x111;&#x1ECB;nh n&#xE0;o trong &#x111;&#x1B0;&#x1EDD;ng c&#x1A1; b&#x1EA3;n n&#x1EEF;a.</li>
<li>L&#x1EB7;p l&#x1EA1;i c&#xE1;c b&#x1B0;&#x1EDB;c 2, 3, 4 v&#x1EDB;i c&#xE1;c &#x111;&#x1B0;&#x1EDD;ng v&#x1EEB;a t&#xEC;m &#x111;&#x1B0;&#x1EE3;c cho &#x111;&#x1EBF;n khi &#x111;&#x1EA1;t &#x111;&#x1EE7; C lu&#x1ED3;ng th&#x1EF1;c thi.</li>
</ul>
<h5 id="mcchephcakimthtestcoverage">M&#x1EE9;c &#x111;&#x1ED9; che ph&#x1EE7; c&#x1EE7;a ki&#x1EC3;m th&#x1EED; (<code>Test coverage</code>)</h5>
<p>C&#xF3; c&#xE1;c m&#x1EE9;c &#x111;&#x1ED9; nh&#x1B0; sau:</p>
<ul>
<li>
<p><code>Method coverage</code>: T&#x1EC9; l&#x1EC7; method &#x111;&#x1B0;&#x1EE3;c g&#x1ECD;i trong qu&#xE1; tr&#xEC;nh test tr&#xEA;n t&#x1ED5;ng s&#x1ED1; method</p>
</li>
<li>
<p><code>Statement coverage</code>: T&#x1EC9; l&#x1EC7; d&#xF2;ng l&#x1EC7;nh &#x111;&#x1B0;&#x1EE3;c th&#x1EF1;c thi trong qu&#xE1; tr&#xEC;nh test tr&#xEA;n t&#x1ED5;ng s&#x1ED1; d&#xF2;ng l&#x1EC7;nh</p>
</li>
<li>
<p><code>Branch coverage</code>: t&#x1EC9; l&#x1EC7; s&#x1ED1; &#x111;i&#x1EC3;m quy&#x1EBF;t &#x111;&#x1ECB;nh &#x111;&#x1B0;&#x1EE3;c ki&#x1EC3;m tra v&#x1EDB;i c&#x1EA3; 2 tr&#x1B0;&#x1EDD;ng h&#x1EE3;p (true/false) tr&#xEA;n t&#x1ED5;ng s&#x1ED1; kh&#x1EA3; n&#x103;ng c&#x1EE7;a t&#x1EA5;t c&#x1EA3; c&#xE1;c &#x111;i&#x1EC3;m quy&#x1EBF;t &#x111;&#x1ECB;nh.</p>
</li>
<li>
<p><code>Condition coverage</code>: t&#x1EC9; l&#x1EC7; s&#x1ED1; bi&#x1EC3;u th&#x1EE9;c logic &#x111;&#x1B0;&#x1EE3;c ki&#x1EC3;m tra (v&#x1EDB;i c&#x1EA3; 2 tr&#x1B0;&#x1EDD;ng h&#x1EE3;p v&#xE0; v&#x1EDB;i c&#x1EA3; nh&#x1EEF;ng bi&#x1EC3;u th&#x1EE9;c logic con) tr&#xEA;n t&#x1ED5;ng s&#x1ED1; kh&#x1EA3; n&#x103;ng c&#x1EE7;a t&#x1EA5;t c&#x1EA3; c&#xE1;c bi&#x1EC3;u th&#x1EE9;c logic.</p>
</li>
</ul>
<h3 id="kimthlungdliudataflowtesting">Ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u (<code>Data flow testing</code>)</h3>
<p>T&#x1B0;&#x1A1;ng t&#x1EF1; nh&#x1B0; ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng &#x111;i&#x1EC1;u khi&#x1EC3;n, nh&#x1B0;ng thay v&#xEC; d&#x1EF1;a tr&#xEA;n &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng x&#x1EED; l&#xFD;, ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u d&#x1EF1;a tr&#xEA;n &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u (<code>Data flow Graph</code>). Lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c x&#xE2;y d&#x1EF1;ng d&#x1EF1;a tr&#xEA;n vi&#x1EC7;c c&#xE1;c s&#x1EF1; ki&#x1EC7;n li&#xEA;n quan &#x111;&#x1EBF;n bi&#x1EBF;n trong ph&#x1EA1;m vi c&#x1EE7;a n&#xF3; (<code>scope</code>). c&#xF3; 3 s&#x1EF1; ki&#x1EC7;n li&#xEA;n quan &#x111;&#x1EBF;n 1 bi&#x1EBF;n l&#xE0;:</p>
<ul>
<li>Khai b&#xE1;o ho&#x1EB7;c g&#xE1;n gi&#xE1; tr&#x1ECB; cho bi&#x1EBF;n (<code>declare</code> - d)</li>
<li>S&#x1EED; d&#x1EE5;ng bi&#x1EBF;n (<code>use</code> - u)</li>
<li>H&#x1EE7;y bi&#x1EBF;n (<code>kill</code> - k)</li>
</ul>
<p>N&#x1EBF;u k&#xED; hi&#x1EC7;u tr&#x1EA1;ng th&#xE1;i ch&#x1B0;a kh&#x1EDF;i t&#x1EA1;o bi&#x1EBF;n l&#xE0; ~, c&#xF3; th&#x1EC3; m&#xF4; t&#x1EA3; 3 kh&#x1EA3; n&#x103;ng x&#x1EED; l&#xFD; &#x111;&#x1EA7;u ti&#xEA;n v&#x1EDB;i 1 bi&#x1EBF;n:</p>
<ul>
<li><code>~d</code>: bi&#x1EBF;n ch&#x1B0;a kh&#x1EDF;i t&#x1EA1;o v&#xE0; th&#x1EF1;c hi&#x1EC7;n khai b&#xE1;o bi&#x1EBF;n =&gt; &#x110;&#xFA;ng</li>
<li><code>~u</code>: bi&#x1EBF;n ch&#x1B0;a kh&#x1EDF;i t&#x1EA1;o v&#xE0; s&#x1EED; d&#x1EE5;ng bi&#x1EBF;n =&gt; sai</li>
<li><code>~k</code>: bi&#x1EBF;n ch&#x1B0;a kh&#x1EDF;i t&#x1EA1;o v&#xE0; h&#x1EE7;y bi&#x1EBF;n =&gt; c&#xF3; th&#x1EC3; &#x111;&#xFA;ng c&#xF3; th&#x1EC3; sai.</li>
</ul>
<p>&#x110;&#x1ED3;ng th&#x1EDD;i, v&#x1EDB;i 3 s&#x1EF1; ki&#x1EC7;n, c&#xF3; th&#x1EC3; t&#x1EA1;o ra 9 kh&#x1EA3; n&#x103;ng nh&#x1B0; sau:</p>
<ul>
<li><code>dd</code>: khai b&#xE1;o v&#xE0; khai b&#xE1;o l&#x1EA1;i =&gt; kh&#xF4;ng h&#x1EE3;p l&#xFD;, c&#xF3; kh&#x1EA3; n&#x103;ng sai</li>
<li><code>du</code>: khai b&#xE1;o r&#x1ED3;i s&#x1EED; d&#x1EE5;ng =&gt; &#x110;&#xFA;ng</li>
<li><code>dk</code>: khai b&#xE1;o r&#x1ED3;i h&#x1EE7;y bi&#x1EBF;n =&gt; c&#xF3; kh&#x1EA3; n&#x103;ng sai</li>
<li><code>ud</code>: s&#x1EED; d&#x1EE5;ng r&#x1ED3;i khai b&#xE1;o/g&#xE1;n gi&#xE1; tr&#x1ECB; m&#x1EDB;i =&gt; &#x110;&#xFA;ng</li>
<li><code>uu</code>: s&#x1EED; d&#x1EE5;ng r&#x1ED3;i ti&#x1EBF;p t&#x1EE5;c s&#x1EED; d&#x1EE5;ng =&gt; &#x110;&#xFA;ng</li>
<li><code>uk</code>: s&#x1EED; d&#x1EE5;ng r&#x1ED3;i h&#x1EE7;y bi&#x1EBF;n =&gt; &#x111;&#xFA;ng</li>
<li><code>kd</code>: h&#x1EE7;y r&#x1ED3;i khai b&#xE1;o/g&#xE1;n gi&#xE1; tr&#x1ECB; m&#x1EDB;i =&gt; &#x110;&#xFA;ng</li>
<li><code>ku</code>: h&#x1EE7;y r&#x1ED3;i s&#x1EED; d&#x1EE5;ng bi&#x1EBF;n =&gt; sai</li>
<li><code>kk</code>: h&#x1EE7;y r&#x1ED3;i ti&#x1EBF;p t&#x1EE5;c h&#x1EE7;y =&gt; sai.</li>
</ul>
<p>D&#x1EF1;a tr&#xEA;n 3 s&#x1EF1; ki&#x1EC7;n (<code>d-u-k</code>) k&#x1EBF;t h&#x1EE3;p v&#x1EDB;i &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng x&#x1EED; l&#xFD; (<code>Control flow Graph</code>) c&#x1EE7;a &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;, ch&#xFA;ng ta c&#xF3; th&#x1EC3; x&#xE2;y d&#x1EF1;ng &#x111;&#x1B0;&#x1EE3;c c&#xE1;c &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u (<code>Data flow Graph</code>) cho t&#x1EEB;ng bi&#x1EBF;n trong &#x111;&#x1A1;n v&#x1ECB; ki&#x1EC3;m th&#x1EED;.<br>
<img src="https://blog.arrow-tech.vn/content/images/2016/07/Microsoft_Word_-_Chuong04_doc_-_Chuong04_pdf.png" alt="Gi&#x1EDB;i thi&#x1EC7;u v&#x1EC1; ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (Whitebox testing)" loading="lazy"></p>
<p>V&#x1EDB;i lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u c&#x1EE7;a 1 bi&#x1EBF;n, ch&#xFA;ng ta th&#x1EF1;c hi&#x1EC7;n 2 b&#x1B0;&#x1EDB;c ki&#x1EC3;m th&#x1EED;: Ki&#x1EC3;m th&#x1EED; t&#x129;nh (<code>static</code>) v&#xE0; ki&#x1EC3;m th&#x1EED; &#x111;&#x1ED9;ng (<code>dynamic</code>).</p>
<ul>
<li>Ki&#x1EC3;m th&#x1EED; t&#x129;nh (<code>static</code>) l&#xE0; th&#x1EF1;c hi&#x1EC7;n ki&#x1EC3;m tra tr&#xEA;n &#x111;&#x1ED3; th&#x1ECB; lu&#x1ED3;ng d&#x1EEF; li&#x1EC7;u &#x111;&#x1B0;&#x1EE3;c d&#x1EF1;ng l&#xEA;n, c&#xF3; c&#x1EA1;nh (x&#x1EED; l&#xFD;) n&#xE0;o c&#xF3; kh&#x1EA3; n&#x103;ng sai ho&#x1EB7;c g&#xE2;y l&#x1ED7;i. V&#xED; d&#x1EE5;: <code>kk</code>, <code>ku</code>,...</li>
</ul>
<p>Ki&#x1EC3;m th&#x1EED; t&#x129;nh (<code>static</code>) c&#xF3; h&#x1EA1;n ch&#x1EBF; l&#xE0; kh&#xF4;ng ph&#xE1;t hi&#x1EC7;n ra &#x111;&#x1B0;&#x1EE3;c m&#x1ED9;t s&#x1ED1; l&#x1ED7;i:</p>
<ul>
<li>L&#x1ED7;i Index Out of Bound</li>
<li>M&#x1ED9;t s&#x1ED1; x&#x1EED; l&#xFD; kh&#xF4;ng h&#x1EE3;p l&#x1EC7; th&#x1EF1;c t&#x1EBF; kh&#xF4;ng bao gi&#x1EDD; x&#x1EA3;y ra khi th&#x1EF1;c thi.</li>
</ul>
<ul>
<li>Ki&#x1EC3;m th&#x1EED; &#x111;&#x1ED9;ng (<code>dynamic</code>) l&#xE0; d&#x1EF1;a tr&#xEA;n lu&#x1ED3;ng x&#x1EED; l&#xFD; &#x111;&#x1EC3; x&#xE2;y d&#x1EF1;ng testcase v&#xE0; ki&#x1EC3;m th&#x1EED;. Ph&#x1B0;&#x1A1;ng ph&#xE1;p x&#xE2;y d&#x1EF1;ng testcase c&#x169;ng d&#x1EF1;a tr&#xEA;n &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p c&#x1EE7;a &#x111;&#x1ED3; th&#x1ECB; t&#x1B0;&#x1A1;ng t&#x1EF1; nh&#x1B0; k&#x1EF9; thu&#x1EAD;t ki&#x1EC3;m th&#x1EED; lu&#x1ED3;ng &#x111;i&#x1EC1;u khi&#x1EC3;n.</li>
</ul>
<h1 id="tngkt">T&#x1ED5;ng k&#x1EBF;t</h1>
<ul>
<li>
<p>Ki&#x1EC3;m th&#x1EED; h&#x1ED9;p tr&#x1EAF;ng (<code>Whitebox Test</code>) l&#xE0; ph&#x1B0;&#x1A1;ng ph&#xE1;p ph&#xF9; h&#x1EE3;p cho Developer th&#x1EF1;c hi&#x1EC7;n Unit Test v&#xE0; Self check ch&#x1EE9;c n&#x103;ng.</p>
</li>
<li>
<p>M&#x1EE9;c &#x111;&#x1ED9; tin c&#x1EAD;y c&#x1EE7;a ki&#x1EC3;m th&#x1EED; x&#xE1;c &#x111;&#x1ECB;nh b&#x1EDF;i &#x111;&#x1ED9; che ph&#x1EE7; (<code>Test coverage</code>) c&#x1EE7;a ki&#x1EC3;m th&#x1EED;.</p>
</li>
<li>
<p><code>Test case</code> &#x111;&#x1B0;&#x1EE3;c x&#xE1;c &#x111;&#x1ECB;nh nh&#x1EDD; s&#x1EED; d&#x1EE5;ng <code>Control flow Graph</code> v&#xE0; <code>Data flow Graph</code>. S&#x1ED1; Test case t&#x1ED1;i thi&#x1EC3;u b&#x1EB1;ng &#x111;&#x1ED9; ph&#x1EE9;c t&#x1EA1;p <code>Cyclomatic</code> c&#x1EE7;a &#x111;&#x1ED3; th&#x1ECB;</p>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>