[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.06,0:00:01.09,Default,,0000,0000,0000,,過去幾節課裡 Dialogue: 0,0:00:01.09,0:00:03.03,Default,,0000,0000,0000,,我們花了些時間 Dialogue: 0,0:00:03.03,0:00:05.08,Default,,0000,0000,0000,,談論過不同的測試方法 Dialogue: 0,0:00:05.08,0:00:08.02,Default,,0000,0000,0000,,也談論過單元測試和整合測試的異同 Dialogue: 0,0:00:08.02,0:00:10.01,Default,,0000,0000,0000,,我們也講解過如何使用RSpec Dialogue: 0,0:00:10.01,0:00:12.05,Default,,0000,0000,0000,,真正將你想測試的程式碼分開 Dialogue: 0,0:00:12.05,0:00:14.09,Default,,0000,0000,0000,,也因為作業三和其他部份的關係 Dialogue: 0,0:00:14.09,0:00:18.02,Default,,0000,0000,0000,,我們也研究過BDD Dialogue: 0,0:00:18.02,0:00:20.06,Default,,0000,0000,0000,,當中,我們基本上就是使用Cucumber把使用者的流程 Dialogue: 0,0:00:20.06,0:00:22.10,Default,,0000,0000,0000,,轉變成整合測試和合格測試 (acceptance test) Dialogue: 0,0:00:22.10,0:00:25.06,Default,,0000,0000,0000,,你已經看到不同層次的測試 Dialogue: 0,0:00:25.06,0:00:27.06,Default,,0000,0000,0000,,所以,這節課的目標基本上只是簡單的總結一下而已 Dialogue: 0,0:00:27.06,0:00:29.09,Default,,0000,0000,0000,,就是說,我們站遠點綜觀看看 Dialogue: 0,0:00:29.09,0:00:33.00,Default,,0000,0000,0000,,並將這些事情一起來看 Dialogue: 0,0:00:33.00,0:00:34.10,Default,,0000,0000,0000,,基本上,這節課的內容將會涵蓋 Dialogue: 0,0:00:34.10,0:00:37.00,Default,,0000,0000,0000,,課本上三到四個章節 Dialogue: 0,0:00:37.00,0:00:39.06,Default,,0000,0000,0000,,我在這邊只是稍微提到而已 Dialogue: 0,0:00:39.06,0:00:41.05,Default,,0000,0000,0000,,好了,有一個問題是常常出現的 Dialogue: 0,0:00:41.05,0:00:43.02,Default,,0000,0000,0000,,我想你們也都會有這個問題 Dialogue: 0,0:00:43.02,0:00:44.05,Default,,0000,0000,0000,,因為你們也有做作業 Dialogue: 0,0:00:44.05,0:00:45.07,Default,,0000,0000,0000,,問題就是:「多少測試才夠呢?」 Dialogue: 0,0:00:45.07,0:00:48.05,Default,,0000,0000,0000,,難過的是 Dialogue: 0,0:00:48.05,0:00:51.01,Default,,0000,0000,0000,,如果你們在業界問這個問題 Dialogue: 0,0:00:51.01,0:00:52.02,Default,,0000,0000,0000,,答案是非常簡單的 Dialogue: 0,0:00:52.02,0:00:53.02,Default,,0000,0000,0000,,「關於這個問題,我們有產品的結案日期, Dialogue: 0,0:00:53.02,0:00:54.10,Default,,0000,0000,0000,,所以在結案日期前能做的測試 Dialogue: 0,0:00:54.10,0:00:56.07,Default,,0000,0000,0000,,即足以。」 Dialogue: 0,0:00:56.07,0:00:58.02,Default,,0000,0000,0000,,也就是有多少時間就做多少 Dialogue: 0,0:00:58.02,0:01:00.00,Default,,0000,0000,0000,,這其實有點顛倒了 Dialogue: 0,0:01:00.00,0:01:01.01,Default,,0000,0000,0000,,顯然不是很好 Dialogue: 0,0:01:01.01,0:01:02.05,Default,,0000,0000,0000,,其實你們可以做的更好,對吧? Dialogue: 0,0:01:02.05,0:01:03.07,Default,,0000,0000,0000,,這邊有些靜態的測量 Dialogue: 0,0:01:03.07,0:01:06.00,Default,,0000,0000,0000,,像是程式裡有多少程式碼 Dialogue: 0,0:01:06.00,0:01:08.02,Default,,0000,0000,0000,,多少行測試用的程式碼等 Dialogue: 0,0:01:08.02,0:01:10.03,Default,,0000,0000,0000,,另外,在業界並不罕見的是 Dialogue: 0,0:01:10.03,0:01:12.07,Default,,0000,0000,0000,,針對測試完整的程式而言 Dialogue: 0,0:01:12.07,0:01:14.06,Default,,0000,0000,0000,,測試用的程式碼的行數 Dialogue: 0,0:01:14.06,0:01:17.07,Default,,0000,0000,0000,,往往是遠遠超過本來程式碼的行數的 Dialogue: 0,0:01:17.07,0:01:19.08,Default,,0000,0000,0000,,甚至,倍增的量也是常見的 Dialogue: 0,0:01:19.08,0:01:21.08,Default,,0000,0000,0000,,我想,即使甚至是 Dialogue: 0,0:01:21.08,0:01:23.02,Default,,0000,0000,0000,,研究程式碼,甚至是習作等 Dialogue: 0,0:01:23.02,0:01:26.08,Default,,0000,0000,0000,,1.5倍也非不合理 Dialogue: 0,0:01:26.08,0:01:30.00,Default,,0000,0000,0000,,也就是說,測試用的程式碼 Dialogue: 0,0:01:30.00,0:01:32.02,Default,,0000,0000,0000,,有應用程式碼的1.5倍 Dialogue: 0,0:01:32.02,0:01:34.02,Default,,0000,0000,0000,,在很多實作的系統裡 Dialogue: 0,0:01:34.02,0:01:35.03,Default,,0000,0000,0000,,就是說是真正需要測試的 Dialogue: 0,0:01:35.03,0:01:36.09,Default,,0000,0000,0000,,測試程式碼對應用程式碼的比率,甚至比這個更高 Dialogue: 0,0:01:36.09,0:01:38.02,Default,,0000,0000,0000,,所以也許可以用另一個較好的方式來問這個問題 Dialogue: 0,0:01:38.02,0:01:39.05,Default,,0000,0000,0000,,就是,與其問「需要多少測試呢?」 Dialogue: 0,0:01:39.05,0:01:42.05,Default,,0000,0000,0000,,不如問「我現在做的測試有多完整?」 Dialogue: 0,0:01:42.05,0:01:44.04,Default,,0000,0000,0000,,「有多徹底?」 Dialogue: 0,0:01:44.04,0:01:45.06,Default,,0000,0000,0000,,這個學期的後半部 Dialogue: 0,0:01:45.06,0:01:46.06,Default,,0000,0000,0000,,Sen教授將會 Dialogue: 0,0:01:46.06,0:01:48.02,Default,,0000,0000,0000,,對正規方法 (formal methods) 作一個簡略的介紹 Dialogue: 0,0:01:48.02,0:01:50.08,Default,,0000,0000,0000,,並談論一下測試和除錯方法的最新進展 Dialogue: 0,0:01:50.08,0:01:52.07,Default,,0000,0000,0000,,但是,對於這點,現在我們還是可以略提一二的 Dialogue: 0,0:01:52.07,0:01:54.01,Default,,0000,0000,0000,,就是說,基於你們已經知道的,我們還是可以略提 Dialogue: 0,0:01:54.01,0:01:57.07,Default,,0000,0000,0000,,一些有關測試涵蓋率 (test coverage) 的基本概念 Dialogue: 0,0:01:57.07,0:01:59.05,Default,,0000,0000,0000,,我也許會說 Dialogue: 0,0:01:59.05,0:02:01.00,Default,,0000,0000,0000,,事實上我們也一直說 Dialogue: 0,0:02:01.00,0:02:03.00,Default,,0000,0000,0000,,正規方法在大的系統上基本上根本是沒用的 Dialogue: 0,0:02:03.00,0:02:05.03,Default,,0000,0000,0000,,不過,我個人的觀點是 Dialogue: 0,0:02:05.03,0:02:07.00,Default,,0000,0000,0000,,這個說法以前的確很對,但現在已經不太對了 Dialogue: 0,0:02:07.00,0:02:09.02,Default,,0000,0000,0000,,我想,有許多特殊的場合裡 Dialogue: 0,0:02:09.02,0:02:10.05,Default,,0000,0000,0000,,特別在測試和除錯方面 Dialogue: 0,0:02:10.05,0:02:12.08,Default,,0000,0000,0000,,正規測試已經獲得了很大的進展 Dialogue: 0,0:02:12.08,0:02:15.08,Default,,0000,0000,0000,,在這方面 Koushik Sen 是個領導先驅 Dialogue: 0,0:02:15.08,0:02:17.09,Default,,0000,0000,0000,,所以,之後你們都有機會可以了解更多 Dialogue: 0,0:02:17.09,0:02:21.04,Default,,0000,0000,0000,,不過現在我講的,是一些可以說是很實際的東西 Dialogue: 0,0:02:21.04,0:02:22.07,Default,,0000,0000,0000,,就是測試涵蓋率的測量 (coverage measurement) Dialogue: 0,0:02:22.07,0:02:24.05,Default,,0000,0000,0000,,因為這就是實際情況 Dialogue: 0,0:02:24.05,0:02:26.02,Default,,0000,0000,0000,,換句話說,假如有人要評估你 Dialogue: 0,0:02:26.02,0:02:28.06,Default,,0000,0000,0000,,就是說在真正的工作時有人要評估你,這就是實際情況 Dialogue: 0,0:02:28.06,0:02:29.05,Default,,0000,0000,0000,,那麼,有什麼基礎的東西呢? Dialogue: 0,0:02:29.05,0:02:30.08,Default,,0000,0000,0000,,讓我給你一個很簡單的類別 Dialogue: 0,0:02:30.08,0:02:32.09,Default,,0000,0000,0000,,來講解有什麼不同的方法來量測 Dialogue: 0,0:02:32.09,0:02:34.08,Default,,0000,0000,0000,,我們的測試可涵蓋多少程式範圍 Dialogue: 0,0:02:34.08,0:02:36.06,Default,,0000,0000,0000,,這邊有些不同的程度差異 Dialogue: 0,0:02:36.06,0:02:37.08,Default,,0000,0000,0000,,以不同的字彙來說的話 Dialogue: 0,0:02:37.08,0:02:40.07,Default,,0000,0000,0000,,這不像是所有的程式部門都通用 Dialogue: 0,0:02:40.07,0:02:42.06,Default,,0000,0000,0000,,但是有一套較通常使用的字彙 Dialogue: 0,0:02:42.06,0:02:43.06,Default,,0000,0000,0000,,是我們的課本裡面用的 Dialogue: 0,0:02:43.06,0:02:44.07,Default,,0000,0000,0000,,就是,我們談到 S0 Dialogue: 0,0:02:44.07,0:02:47.04,Default,,0000,0000,0000,,意思是你呼叫每個方法一次 Dialogue: 0,0:02:47.04,0:02:50.04,Default,,0000,0000,0000,,就是說,你呼叫 foo,然後呼叫 bar,就完成了 Dialogue: 0,0:02:50.04,0:02:52.02,Default,,0000,0000,0000,,這就是 S0 coverage,不是怎麼的全盤 Dialogue: 0,0:02:52.02,0:02:54.07,Default,,0000,0000,0000,,比較嚴謹的 S1 Dialogue: 0,0:02:54.07,0:02:56.01,Default,,0000,0000,0000,,基本上就是,我們呼叫了每一個方法 Dialogue: 0,0:02:56.01,0:02:57.03,Default,,0000,0000,0000,,而且是只要可以呼叫某個方法的地方都去呼叫那個方法 Dialogue: 0,0:02:57.03,0:02:58.08,Default,,0000,0000,0000,,這什麼意思? Dialogue: 0,0:02:58.08,0:03:00.01,Default,,0000,0000,0000,,舉例來說 Dialogue: 0,0:03:00.01,0:03:01.01,Default,,0000,0000,0000,,只呼叫 bar 不夠 Dialogue: 0,0:03:01.01,0:03:02.10,Default,,0000,0000,0000,,你要先確定你一定會 Dialogue: 0,0:03:02.10,0:03:05.06,Default,,0000,0000,0000,,在這裏呼叫 bar 至少一次 Dialogue: 0,0:03:05.06,0:03:07.02,Default,,0000,0000,0000,,除此以外,還要確定 Dialogue: 0,0:03:07.02,0:03:10.04,Default,,0000,0000,0000,,任何可以呼叫 bar 的外部函數都要呼叫 bar 一次 Dialogue: 0,0:03:10.04,0:03:12.08,Default,,0000,0000,0000,,至於 SimpleCov 所測量的 C0 Dialogue: 0,0:03:12.08,0:03:15.10,Default,,0000,0000,0000,,(你們當中已經設定好 SimpleCov 且實際做過的人啊) Dialogue: 0,0:03:15.10,0:03:18.05,Default,,0000,0000,0000,,基本上就是表示你執行所有的程式碼 Dialogue: 0,0:03:18.05,0:03:20.00,Default,,0000,0000,0000,,在你的程式碼全部都做過一次 Dialogue: 0,0:03:20.00,0:03:22.05,Default,,0000,0000,0000,,但這邊要小心一下 Dialogue: 0,0:03:22.05,0:03:25.06,Default,,0000,0000,0000,,條件運算只被算一次而已 Dialogue: 0,0:03:25.06,0:03:28.09,Default,,0000,0000,0000,,所以假如發生條件判斷例如執行了 "if" Dialogue: 0,0:03:28.09,0:03:31.07,Default,,0000,0000,0000,,只要程式碼分支有執行到 Dialogue: 0,0:03:31.07,0:03:33.04,Default,,0000,0000,0000,,你已經執行了 "if" 陳述句 Dialogue: 0,0:03:33.04,0:03:35.07,Default,,0000,0000,0000,,所以 C0 仍然只是涵蓋比較表層的範圍 Dialogue: 0,0:03:35.07,0:03:37.03,Default,,0000,0000,0000,,但是我們將會看到 Dialogue: 0,0:03:37.03,0:03:39.02,Default,,0000,0000,0000,,對 C0 涵蓋率的正確理解,其實是這樣的: Dialogue: 0,0:03:39.02,0:03:41.08,Default,,0000,0000,0000,,假如 C0 程度的涵蓋率你也測出了不好的涵蓋率 Dialogue: 0,0:03:41.08,0:03:44.01,Default,,0000,0000,0000,,你的測試涵蓋率就真的是非常非常的差了 Dialogue: 0,0:03:44.01,0:03:46.01,Default,,0000,0000,0000,,因為 Dialogue: 0,0:03:46.01,0:03:47.04,Default,,0000,0000,0000,,你如果連這種簡單的表層測試也達不到 Dialogue: 0,0:03:47.04,0:03:50.00,Default,,0000,0000,0000,,你的測試大概很有問題了 Dialogue: 0,0:03:50.00,0:03:51.09,Default,,0000,0000,0000,,C1 則是更進一步 Dialogue: 0,0:03:51.09,0:03:53.07,Default,,0000,0000,0000,,可以這麼說 Dialogue: 0,0:03:53.07,0:03:55.02,Default,,0000,0000,0000,,必須把所有分支雙方向測試 Dialogue: 0,0:03:55.02,0:03:56.06,Default,,0000,0000,0000,,所以當我們在執行 "if" 陳述句 Dialogue: 0,0:03:56.06,0:03:58.07,Default,,0000,0000,0000,,就必須確保 Dialogue: 0,0:03:58.07,0:03:59.09,Default,,0000,0000,0000,,"if x" 這個部分執行到 Dialogue: 0,0:03:59.09,0:04:05.01,Default,,0000,0000,0000,,"if not x"這個部分也至少執行一次,才符合 C1 Dialogue: 0,0:04:05.01,0:04:08.04,Default,,0000,0000,0000,,如果要再進一步,可以再加入 decision coverage Dialogue: 0,0:04:08.04,0:04:09.06,Default,,0000,0000,0000,,意思是:我們如果想要... Dialogue: 0,0:04:09.06,0:04:12.04,Default,,0000,0000,0000,,假如我們發現 "if" 陳述句 Dialogue: 0,0:04:12.04,0:04:13.09,Default,,0000,0000,0000,,裡面包含不只一種陳述句 Dialogue: 0,0:04:13.09,0:04:15.07,Default,,0000,0000,0000,,我們必須確保每個陳述句 Dialogue: 0,0:04:15.07,0:04:17.10,Default,,0000,0000,0000,,都可以雙向評估 Dialogue: 0,0:04:17.10,0:04:19.07,Default,,0000,0000,0000,,換句話說 Dialogue: 0,0:04:19.07,0:04:22.04,Default,,0000,0000,0000,,如果 "if" 不執行 Dialogue: 0,0:04:22.04,0:04:24.03,Default,,0000,0000,0000,,就要確保 fail 至少一次 Dialogue: 0,0:04:24.03,0:04:26.04,Default,,0000,0000,0000,,因為 y 至少一次是 false , 又因為 z 是 false Dialogue: 0,0:04:26.04,0:04:28.09,Default,,0000,0000,0000,,任何陳述句 Dialogue: 0,0:04:28.09,0:04:31.02,Default,,0000,0000,0000,,都是獨立的依條件改變結果 Dialogue: 0,0:04:31.02,0:04:34.05,Default,,0000,0000,0000,,都必須能夠雙向測試 Dialogue: 0,0:04:34.05,0:04:36.00,Default,,0000,0000,0000,,然後 Dialogue: 0,0:04:36.00,0:04:38.05,Default,,0000,0000,0000,,有一件事很多人都希望做到 Dialogue: 0,0:04:38.05,0:04:41.03,Default,,0000,0000,0000,,但沒有共識說這麼做到底有沒有意義 Dialogue: 0,0:04:41.03,0:04:42.08,Default,,0000,0000,0000,,就是每個路徑都走過 Dialogue: 0,0:04:42.08,0:04:45.05,Default,,0000,0000,0000,,顯然,這是有困難度的 Dialogue: 0,0:04:45.05,0:04:48.03,Default,,0000,0000,0000,,因為所有條件都考慮會造成量呈指數倍數的增加 Dialogue: 0,0:04:48.03,0:04:53.01,Default,,0000,0000,0000,,況且,通常都很難去評估 Dialogue: 0,0:04:53.01,0:04:55.03,Default,,0000,0000,0000,,究竟是不是每個路徑都已經測試 Dialogue: 0,0:04:55.03,0:04:57.00,Default,,0000,0000,0000,,針對這些困難的正規方法,是有的 Dialogue: 0,0:04:57.00,0:04:58.08,Default,,0000,0000,0000,,它們可以讓你們知道洞在哪 Dialogue: 0,0:04:58.08,0:05:01.03,Default,,0000,0000,0000,,但是最根本的是 Dialogue: 0,0:05:01.03,0:05:03.00,Default,,0000,0000,0000,,在大部分的商業軟體公司裡 Dialogue: 0,0:05:03.00,0:05:04.09,Default,,0000,0000,0000,,對於 C2 有多少價值的觀念 Dialogue: 0,0:05:04.09,0:05:06.07,Default,,0000,0000,0000,,還不太一致 Dialogue: 0,0:05:06.07,0:05:08.07,Default,,0000,0000,0000,,就是說,C2 比起 C0 或 C1 究竟有多少價值,還是沒有一個共識 Dialogue: 0,0:05:08.07,0:05:10.01,Default,,0000,0000,0000,,所以,我認為,這個課程的用意是 Dialogue: 0,0:05:10.01,0:05:11.07,Default,,0000,0000,0000,,讓你們了解 Dialogue: 0,0:05:11.07,0:05:13.02,Default,,0000,0000,0000,,怎樣使用測試涵蓋率的資訊 Dialogue: 0,0:05:13.02,0:05:16.04,Default,,0000,0000,0000,,SimpleCov 利用 Ruby 中的一些功能 Dialogue: 0,0:05:16.04,0:05:18.01,Default,,0000,0000,0000,,讓你們可以做 C0 測試 Dialogue: 0,0:05:18.01,0:05:19.06,Default,,0000,0000,0000,,也有很好的報表 Dialogue: 0,0:05:19.06,0:05:21.02,Default,,0000,0000,0000,,給我們的資訊 Dialogue: 0,0:05:21.02,0:05:22.10,Default,,0000,0000,0000,,大抵上而言是逐檔案,逐程式行的資訊 Dialogue: 0,0:05:22.10,0:05:24.09,Default,,0000,0000,0000,,你可以看看你的涵蓋範圍 Dialogue: 0,0:05:24.09,0:05:27.02,Default,,0000,0000,0000,,我覺得 Dialogue: 0,0:05:27.02,0:05:31.02,Default,,0000,0000,0000,,這是個很好的開始 Dialogue: 0,0:05:31.02,0:05:33.08,Default,,0000,0000,0000,,我們已經看了不同種類的測試後 Dialogue: 0,0:05:33.08,0:05:37.02,Default,,0000,0000,0000,,往回退一步宏觀的看 Dialogue: 0,0:05:37.02,0:05:38.10,Default,,0000,0000,0000,,我們實際看過的不同的測試 Dialogue: 0,0:05:38.10,0:05:40.08,Default,,0000,0000,0000,,究竟有那幾種? Dialogue: 0,0:05:40.08,0:05:42.03,Default,,0000,0000,0000,,如果使用不同的測試 Dialogue: 0,0:05:42.03,0:05:43.09,Default,,0000,0000,0000,,各自的缺點又是什麼? Dialogue: 0,0:05:43.09,0:05:47.02,Default,,0000,0000,0000,,我們已經看過單一類別和方法的程度 Dialogue: 0,0:05:47.02,0:05:50.01,Default,,0000,0000,0000,,我們用 RSpec 大量使用了 mocking 和 stubbing 測試 Dialogue: 0,0:05:50.01,0:05:53.00,Default,,0000,0000,0000,,比如,當我們模型中測試方法 Dialogue: 0,0:05:53.00,0:05:55.06,Default,,0000,0000,0000,,這是單元測試例子 Dialogue: 0,0:05:55.06,0:05:59.02,Default,,0000,0000,0000,,我們也完成其他非常像功能或模組測試 Dialogue: 0,0:06:00.10,0:06:02.07,Default,,0000,0000,0000,,裡面有多個模組 Dialogue: 0,0:06:02.07,0:06:04.06,Default,,0000,0000,0000,,所以如果我們有了 controller 得規格 Dialogue: 0,0:06:04.06,0:06:07.08,Default,,0000,0000,0000,,我們看到就模擬 POST 的行為 Dialogue: 0,0:06:07.08,0:06:09.03,Default,,0000,0000,0000,,但要記住 Dialogue: 0,0:06:09.03,0:06:10.09,Default,,0000,0000,0000,,送出的 POST 要通過 routing subsystem 才到 controller Dialogue: 0,0:06:12.04,0:06:14.05,Default,,0000,0000,0000,,controller 完成後會產出一個 view Dialogue: 0,0:06:14.05,0:06:16.01,Default,,0000,0000,0000,,事實上還有其他部分 Dialogue: 0,0:06:16.01,0:06:17.07,Default,,0000,0000,0000,,會和 controller 一起運作 Dialogue: 0,0:06:17.07,0:06:19.10,Default,,0000,0000,0000,,使得 controller 規格能通過 Dialogue: 0,0:06:19.10,0:06:21.05,Default,,0000,0000,0000,,這是裡面的某個部分 Dialogue: 0,0:06:21.05,0:06:23.04,Default,,0000,0000,0000,,我們在這邊有多個方法用到不只一個類別 Dialogue: 0,0:06:25.00,0:06:27.00,Default,,0000,0000,0000,,但我們仍要注意 Dialogue: 0,0:06:27.00,0:06:28.09,Default,,0000,0000,0000,,這只在系統中的一小部分 Dialogue: 0,0:06:28.09,0:06:31.04,Default,,0000,0000,0000,,我們仍廣泛的用 mocking 以及 stubbing Dialogue: 0,0:06:31.04,0:06:35.03,Default,,0000,0000,0000,,把我們想要測試的行為獨立出來 Dialogue: 0,0:06:35.03,0:06:36.09,Default,,0000,0000,0000,,在 Cucumber 層級的整合或系統測試 Dialogue: 0,0:06:38.05,0:06:41.07,Default,,0000,0000,0000,,他們測試了程式的全部路徑 Dialogue: 0,0:06:41.07,0:06:43.04,Default,,0000,0000,0000,,可能也觸及了相當多不同的模組 Dialogue: 0,0:06:43.04,0:06:46.00,Default,,0000,0000,0000,,最小化使用 mocks 和 stubs Dialogue: 0,0:06:46.00,0:06:48.03,Default,,0000,0000,0000,,因為整合測試其中一個目標 Dialogue: 0,0:06:48.03,0:06:50.10,Default,,0000,0000,0000,,是能確切的測試個區塊之間的相互影響 Dialogue: 0,0:06:50.10,0:06:53.02,Default,,0000,0000,0000,,所以如果你不想用 stub 或控制這些相互影響 Dialogue: 0,0:06:53.02,0:06:54.08,Default,,0000,0000,0000,,你想要讓系統執行它就會執行 Dialogue: 0,0:06:56.03,0:06:58.02,Default,,0000,0000,0000,,如果這是在開發時 Dialogue: 0,0:06:58.02,0:07:00.07,Default,,0000,0000,0000,,那麼要如何會比較這些不同的測試? Dialogue: 0,0:07:00.07,0:07:02.04,Default,,0000,0000,0000,,我們看看這邊有幾個不同的軸 Dialogue: 0,0:07:02.04,0:07:05.01,Default,,0000,0000,0000,,其中之一是他們需要多長時間運行 Dialogue: 0,0:07:05.01,0:07:06.09,Default,,0000,0000,0000,,RSpec 和 Cucumber 看似有較高的啟動時間 Dialogue: 0,0:07:09.01,0:07:10.01,Default,,0000,0000,0000,,但如您所見 Dialogue: 0,0:07:10.01,0:07:11.09,Default,,0000,0000,0000,,如果加上更多的 RSpec 測試 Dialogue: 0,0:07:11.09,0:07:14.04,Default,,0000,0000,0000,,並在後臺執行自動測試 Dialogue: 0,0:07:14.04,0:07:17.09,Default,,0000,0000,0000,,一旦 RSpec 開始 Dialogue: 0,0:07:17.09,0:07:19.09,Default,,0000,0000,0000,,會執行 specs 相當快 Dialogue: 0,0:07:19.09,0:07:21.10,Default,,0000,0000,0000,,而 Cucumber 需要很長時間 Dialogue: 0,0:07:21.10,0:07:24.06,Default,,0000,0000,0000,,因為 Cucumber 觸發了整個應用程式 Dialogue: 0,0:07:24.06,0:07:26.01,Default,,0000,0000,0000,,這學期末 Dialogue: 0,0:07:26.01,0:07:28.09,Default,,0000,0000,0000,,我們將會看到讓 Cucumber 更慢 Dialogue: 0,0:07:28.09,0:07:30.07,Default,,0000,0000,0000,,因為整個瀏覽器內部都要觸發 Dialogue: 0,0:07:30.07,0:07:33.04,Default,,0000,0000,0000,,就像是傀儡操控 Firefox Dialogue: 0,0:07:33.04,0:07:35.08,Default,,0000,0000,0000,,所以可以測試 Javascript 程式 Dialogue: 0,0:07:35.08,0:07:37.00,Default,,0000,0000,0000,,實際上我們做的 Dialogue: 0,0:07:37.00,0:07:40.03,Default,,0000,0000,0000,,我們能和朋友們在 SourceLabs 就在雲端裡操作 Dialogue: 0,0:07:40.03,0:07:42.08,Default,,0000,0000,0000,,真令人興奮 Dialogue: 0,0:07:42.08,0:07:45.08,Default,,0000,0000,0000,,所以執行的快與慢 Dialogue: 0,0:07:46.07,0:07:48.02,Default,,0000,0000,0000,,假如單元測試中發生了錯誤 Dialogue: 0,0:07:48.02,0:07:49.08,Default,,0000,0000,0000,,通常很容易發生 Dialogue: 0,0:07:49.08,0:07:52.03,Default,,0000,0000,0000,,要找出和追蹤該錯誤的來源 Dialogue: 0,0:07:52.03,0:07:53.07,Default,,0000,0000,0000,,正是因為獨立測試 Dialogue: 0,0:07:53.07,0:07:56.02,Default,,0000,0000,0000,,你已經 stub 所以無所謂 Dialogue: 0,0:07:56.02,0:07:58.02,Default,,0000,0000,0000,,你只專注在感興趣的行為 Dialogue: 0,0:07:58.02,0:07:59.08,Default,,0000,0000,0000,,如果已經做得很好但是測試時\N有些錯誤的地方又發生錯誤 Dialogue: 0,0:08:04.09,0:08:07.04,Default,,0000,0000,0000,,相反地\N如果您用 Cucumber 差不多10個步驟 Dialogue: 0,0:08:08.09,0:08:10.03,Default,,0000,0000,0000,,每一步都會觸擊到應用程式的一部分 Dialogue: 0,0:08:11.06,0:08:12.09,Default,,0000,0000,0000,,這就會花很多時間才能找到那個 bug Dialogue: 0,0:08:14.08,0:08:16.01,Default,,0000,0000,0000,,所以需要去衡量\N能夠涵蓋的錯誤範圍 Dialogue: 0,0:08:20.06,0:08:23.00,Default,,0000,0000,0000,,如果你寫一個好的套件用來作單元測試和功能測試 Dialogue: 0,0:08:24.07,0:08:26.02,Default,,0000,0000,0000,,您可以有很高的覆蓋範圍 Dialogue: 0,0:08:26.02,0:08:27.08,Default,,0000,0000,0000,,您可以產生 SimpleCov 報告 Dialogue: 0,0:08:27.08,0:08:30.08,Default,,0000,0000,0000,,也可以在檔案中的任何一行沒有側試過的程式碼 Dialogue: 0,0:08:32.04,0:08:34.02,Default,,0000,0000,0000,,做會涵蓋到這行的測試 Dialogue: 0,0:08:34.02,0:08:36.01,Default,,0000,0000,0000,,要找出如何改善您的覆蓋範圍 Dialogue: 0,0:08:36.01,0:08:37.06,Default,,0000,0000,0000,,例如在 C0 能更輕鬆地完成與單元測試 Dialogue: 0,0:08:40.02,0:08:42.02,Default,,0000,0000,0000,,而 Cucumber 測試會觸擊大量的程式碼 Dialogue: 0,0:08:45.08,0:08:47.08,Default,,0000,0000,0000,,但你的方法就顯得很少 Dialogue: 0,0:08:47.08,0:08:49.04,Default,,0000,0000,0000,,所以如果目標是提昇涵蓋範圍 Dialogue: 0,0:08:49.04,0:08:51.03,Default,,0000,0000,0000,,就用工具來協助單元的層級 Dialogue: 0,0:08:51.03,0:08:53.01,Default,,0000,0000,0000,,這樣可以更專心去了解程式那邊是不是還沒側過 Dialogue: 0,0:08:54.07,0:08:56.06,Default,,0000,0000,0000,,然後可以寫相當針對性的測試針對這些部分 Dialogue: 0,0:08:58.09,0:09:01.04,Default,,0000,0000,0000,,就像把這些部分放在一起做單元測試 Dialogue: 0,0:09:03.04,0:09:05.06,Default,,0000,0000,0000,,因為這些分離出來測試適合用 mocks 來隔開你不在意的部分 Dialogue: 0,0:09:09.01,0:09:11.02,Default,,0000,0000,0000,,定義上這意味著不是在測試介面 Dialogue: 0,0:09:12.07,0:09:14.10,Default,,0000,0000,0000,,而像是在軟體裡有智慧一樣 Dialogue: 0,0:09:14.10,0:09:16.07,Default,,0000,0000,0000,,很多有趣的錯誤 Dialogue: 0,0:09:16.07,0:09:18.08,Default,,0000,0000,0000,,發生在各部分間的介面 Dialogue: 0,0:09:18.08,0:09:20.08,Default,,0000,0000,0000,,(以下尚未處理) 並在類中或在方法內不進行排序的 Dialogue: 0,0:09:20.08,0:09:22.04,Default,,0000,0000,0000,,那些是有點簡單的 bug,追查 Dialogue: 0,0:09:22.04,0:09:24.03,Default,,0000,0000,0000,,與在另一個極端 Dialogue: 0,0:09:24.03,0:09:26.08,Default,,0000,0000,0000,,你越集成測試走向極端 Dialogue: 0,0:09:26.08,0:09:29.07,Default,,0000,0000,0000,,你應該少依賴類比考試 Dialogue: 0,0:09:29.07,0:09:30.09,Default,,0000,0000,0000,,這一確切原因 Dialogue: 0,0:09:30.09,0:09:32.07,Default,,0000,0000,0000,,現在我們看到的如果你在測試類似 Dialogue: 0,0:09:32.07,0:09:34.02,Default,,0000,0000,0000,,也就是說,在面向服務的體系結構 Dialogue: 0,0:09:34.02,0:09:35.09,Default,,0000,0000,0000,,你要在其上與遠端網站進行交互 Dialogue: 0,0:09:35.09,0:09:37.03,Default,,0000,0000,0000,,你最終仍 Dialogue: 0,0:09:37.03,0:09:38.09,Default,,0000,0000,0000,,不必做了相當大的嘲弄、 鉗 Dialogue: 0,0:09:38.09,0:09:40.03,Default,,0000,0000,0000,,這樣,你不要依賴互聯網 Dialogue: 0,0:09:40.03,0:09:41.07,Default,,0000,0000,0000,,為了使您的測試通過 Dialogue: 0,0:09:41.07,0:09:43.01,Default,,0000,0000,0000,,但是,總體上說 Dialogue: 0,0:09:43.01,0:09:47.01,Default,,0000,0000,0000,,你想盡可能多的類比考試,您可以刪除 Dialogue: 0,0:09:47.01,0:09:48.10,Default,,0000,0000,0000,,而讓系統運行的方式,它將運行在現實生活中 Dialogue: 0,0:09:48.10,0:09:52.07,Default,,0000,0000,0000,,所以,好消息是你 * 是 * 測試介面 Dialogue: 0,0:09:52.07,0:09:54.07,Default,,0000,0000,0000,,* 但 * 當事情出錯在一個介面 Dialogue: 0,0:09:54.07,0:09:57.05,Default,,0000,0000,0000,,因為您的解析度不是那麼好 Dialogue: 0,0:09:57.05,0:10:00.03,Default,,0000,0000,0000,,可能需要很長時間弄清楚它是什麼 Dialogue: 0,0:10:00.03,0:10:05.02,Default,,0000,0000,0000,,那麼,什麼是某種程度的高階位從折 Dialogue: 0,0:10:05.02,0:10:07.02,Default,,0000,0000,0000,,是你真的不想依賴 Dialogue: 0,0:10:07.02,0:10:08.08,Default,,0000,0000,0000,,太重上任何一種測試 Dialogue: 0,0:10:08.08,0:10:10.08,Default,,0000,0000,0000,,他們為不同的目的和具體取決於服務上 Dialogue: 0,0:10:10.08,0:10:13.04,Default,,0000,0000,0000,,你想行使您更多的介面 Dialogue: 0,0:10:13.04,0:10:15.09,Default,,0000,0000,0000,,或你想提高你的細細微性覆蓋率 Dialogue: 0,0:10:15.09,0:10:18.00,Default,,0000,0000,0000,,這會影響你如何發展你的測試套件 Dialogue: 0,0:10:18.00,0:10:20.06,Default,,0000,0000,0000,,和你就會把它演進隨您的軟體 Dialogue: 0,0:10:20.06,0:10:24.01,Default,,0000,0000,0000,,因此,我們使用一組特定的測試中的術語 Dialogue: 0,0:10:24.01,0:10:26.03,Default,,0000,0000,0000,,它是術語到,通過和大 Dialogue: 0,0:10:26.03,0:10:29.00,Default,,0000,0000,0000,,最常用的 Rails 社區 Dialogue: 0,0:10:29.00,0:10:30.06,Default,,0000,0000,0000,,但有一些變化 Dialogue: 0,0:10:30.06,0:10:33.07,Default,,0000,0000,0000,,[和] 你可能會聽到的一些其他術語 Dialogue: 0,0:10:33.07,0:10:35.02,Default,,0000,0000,0000,,如果你去找一份工作的某個地方 Dialogue: 0,0:10:35.02,0:10:36.09,Default,,0000,0000,0000,,你聽到有關變異測試 Dialogue: 0,0:10:36.09,0:10:38.07,Default,,0000,0000,0000,,我們還沒有用過 Dialogue: 0,0:10:38.07,0:10:40.02,Default,,0000,0000,0000,,這是一個有趣的想法,我認為,發明的 Dialogue: 0,0:10:40.02,0:10:43.04,Default,,0000,0000,0000,,維與駕駛艙,有,排序的 Dialogue: 0,0:10:43.04,0:10:44.09,Default,,0000,0000,0000,,軟體測試的通用書 Dialogue: 0,0:10:44.09,0:10:46.05,Default,,0000,0000,0000,,這個想法是: Dialogue: 0,0:10:46.05,0:10:48.00,Default,,0000,0000,0000,,假設我向我的代碼提交蓄意的 bug Dialogue: 0,0:10:48.00,0:10:49.05,Default,,0000,0000,0000,,這不會迫使一些測試失敗嗎? Dialogue: 0,0:10:49.05,0:10:53.00,Default,,0000,0000,0000,,因為,如果我改變,你知道,"如果 x"到"如果不 x" Dialogue: 0,0:10:53.00,0:10:56.01,Default,,0000,0000,0000,,並沒有測試失敗,然後要麼我的思念一些報導 Dialogue: 0,0:10:56.01,0:10:59.02,Default,,0000,0000,0000,,或我的應用程式是非常奇怪和不知何故不確定性 Dialogue: 0,0:10:59.02,0:11:03.10,Default,,0000,0000,0000,,模糊測試,其中 Koushik 森可能更詳細地談 Dialogue: 0,0:11:03.10,0:11:07.08,Default,,0000,0000,0000,,基本上,這就是"10,000 猴子在打字機 Dialogue: 0,0:11:07.08,0:11:09.02,Default,,0000,0000,0000,,在您的代碼中扔隨機輸入" Dialogue: 0,0:11:09.02,0:11:10.04,Default,,0000,0000,0000,,有趣的是, Dialogue: 0,0:11:10.04,0:11:11.06,Default,,0000,0000,0000,,我們一直在做這些測試 Dialogue: 0,0:11:11.06,0:11:13.09,Default,,0000,0000,0000,,基本上是精心編制來測試應用程式 Dialogue: 0,0:11:13.09,0:11:15.06,Default,,0000,0000,0000,,它設計的方法 Dialogue: 0,0:11:15.06,0:11:16.09,Default,,0000,0000,0000,,和這些,你知道,模糊測試 Dialogue: 0,0:11:16.09,0:11:19.06,Default,,0000,0000,0000,,有關測試應用程式的方式是它 * 不是 *,可使用 Dialogue: 0,0:11:19.06,0:11:22.10,Default,,0000,0000,0000,,所以,如果會發生什麼你扔巨大表單提交 Dialogue: 0,0:11:22.10,0:11:25.04,Default,,0000,0000,0000,,如果你把控制字元放在您的表單中,將會發生什麼? Dialogue: 0,0:11:25.04,0:11:27.06,Default,,0000,0000,0000,,如果您反復提交同樣的事情,會發生什麼? Dialogue: 0,0:11:27.06,0:11:29.09,Default,,0000,0000,0000,,Koushik 有一個統計資料, Dialogue: 0,0:11:29.09,0:11:32.03,Default,,0000,0000,0000,,微軟認定他們的 bug 的 20 % Dialogue: 0,0:11:32.03,0:11:34.06,Default,,0000,0000,0000,,使用一些變異的模糊化測試 Dialogue: 0,0:11:34.06,0:11:36.03,Default,,0000,0000,0000,,和,約 25 % Dialogue: 0,0:11:36.03,0:11:39.02,Default,,0000,0000,0000,,常見的 Unix 命令列程式的 Dialogue: 0,0:11:39.02,0:11:40.09,Default,,0000,0000,0000,,可以向崩潰 Dialogue: 0,0:11:40.09,0:11:44.02,Default,,0000,0000,0000,,[當] 把侵略性模糊測試通過 Dialogue: 0,0:11:44.02,0:11:46.09,Default,,0000,0000,0000,,定義使用覆蓋範圍是我們還沒有完成的事情 Dialogue: 0,0:11:46.09,0:11:48.09,Default,,0000,0000,0000,,但它是另一個有趣的概念 Dialogue: 0,0:11:48.09,0:11:50.09,Default,,0000,0000,0000,,我的程式在任何一點的設想是, Dialogue: 0,0:11:50.09,0:11:52.06,Default,,0000,0000,0000,,有一個地方,我的定義 — — Dialogue: 0,0:11:52.06,0:11:54.05,Default,,0000,0000,0000,,或賦值給一些變數 — — Dialogue: 0,0:11:54.05,0:11:56.00,Default,,0000,0000,0000,,然後還有下游的地方 Dialogue: 0,0:11:56.00,0:11:57.08,Default,,0000,0000,0000,,大概我的去向消費的價值 — — Dialogue: 0,0:11:57.08,0:11:59.06,Default,,0000,0000,0000,,有人要使用此值 Dialogue: 0,0:11:59.06,0:12:01.01,Default,,0000,0000,0000,,我已覆蓋每一對嗎? Dialogue: 0,0:12:01.01,0:12:02.06,Default,,0000,0000,0000,,換句話說,做有測試在每一對 Dialogue: 0,0:12:02.06,0:12:04.05,Default,,0000,0000,0000,,定義一個變數和某個地方使用它 Dialogue: 0,0:12:04.05,0:12:07.01,Default,,0000,0000,0000,,在我的測試套件的某些部分執行 Dialogue: 0,0:12:07.01,0:12:10.07,Default,,0000,0000,0000,,它有時被稱為杜覆蓋範圍 Dialogue: 0,0:12:10.07,0:12:14.01,Default,,0000,0000,0000,,其他條件,我認為不廣泛地不再使用 Dialogue: 0,0:12:14.01,0:12:17.07,Default,,0000,0000,0000,,與白牌或與 glassbox 黑匣子黑匣子 Dialogue: 0,0:12:17.07,0:12:20.02,Default,,0000,0000,0000,,大致上黑匣子測試是一個從寫入 Dialogue: 0,0:12:20.02,0:12:22.04,Default,,0000,0000,0000,,事物的外部規範的角度來看 Dialogue: 0,0:12:22.04,0:12:24.02,Default,,0000,0000,0000,,[例如:]"這是一個雜湊表 Dialogue: 0,0:12:24.02,0:12:26.02,Default,,0000,0000,0000,,當我把放在一個鍵時應回到一個值 Dialogue: 0,0:12:26.02,0:12:28.01,Default,,0000,0000,0000,,如果刪除了關鍵值不存在" Dialogue: 0,0:12:28.01,0:12:29.10,Default,,0000,0000,0000,,這是一個黑匣子測試,因為它並沒有說 Dialogue: 0,0:12:29.10,0:12:32.03,Default,,0000,0000,0000,,任何有關該雜湊表如何實施的 Dialogue: 0,0:12:32.03,0:12:34.07,Default,,0000,0000,0000,,和它不會嘗試狠抓落實 Dialogue: 0,0:12:34.07,0:12:36.06,Default,,0000,0000,0000,,相應的白牌測試可能是: Dialogue: 0,0:12:36.06,0:12:38.01,Default,,0000,0000,0000,,"我知道些什麼雜湊函數 Dialogue: 0,0:12:38.01,0:12:39.10,Default,,0000,0000,0000,,和我要去刻意製造 Dialogue: 0,0:12:39.10,0:12:41.09,Default,,0000,0000,0000,,我的測試用例中的雜湊鍵 Dialogue: 0,0:12:41.09,0:12:43.08,Default,,0000,0000,0000,,這造成了大量的散列碰撞 Dialogue: 0,0:12:43.08,0:12:45.10,Default,,0000,0000,0000,,以確保我正在測試的功能,部分" Dialogue: 0,0:12:45.10,0:12:49.01,Default,,0000,0000,0000,,現在,C0 測試覆蓋工具,像 SimpleCov Dialogue: 0,0:12:49.01,0:12:52.00,Default,,0000,0000,0000,,將顯示,如果你有的只是黑匣子測試 Dialogue: 0,0:12:52.00,0:12:53.03,Default,,0000,0000,0000,,您可能會發現, Dialogue: 0,0:12:53.03,0:12:55.06,Default,,0000,0000,0000,,碰撞覆蓋代碼不是很多時候被撞傷 Dialogue: 0,0:12:55.06,0:12:56.08,Default,,0000,0000,0000,,,可能會提示您,然後說: Dialogue: 0,0:12:56.08,0:12:58.03,Default,,0000,0000,0000,,"好的如果我真的要加強,— — Dialogue: 0,0:12:58.03,0:13:00.01,Default,,0000,0000,0000,,第一,如果我想要提高這些測試的覆蓋範圍 Dialogue: 0,0:13:00.01,0:13:02.01,Default,,0000,0000,0000,,現在要寫白牌或 glassbox 測試 Dialogue: 0,0:13:02.01,0:13:04.06,Default,,0000,0000,0000,,我要向內看看,請參閱執行什麼呢 Dialogue: 0,0:13:04.06,0:13:05.06,Default,,0000,0000,0000,,並找到具體的方法 Dialogue: 0,0:13:05.06,0:13:10.06,Default,,0000,0000,0000,,試圖打破邪惡的方式實施" Dialogue: 0,0:13:10.06,0:13:13.08,Default,,0000,0000,0000,,所以,我認為,測試是一種生活方式,正確嗎? Dialogue: 0,0:13:13.08,0:13:16.07,Default,,0000,0000,0000,,我們已經遠離的階段 Dialogue: 0,0:13:16.07,0:13:18.03,Default,,0000,0000,0000,,"我們將建立整個事情,然後,我們將考驗" Dialogue: 0,0:13:18.03,0:13:19.09,Default,,0000,0000,0000,,和我們已經進入的階段 Dialogue: 0,0:13:19.09,0:13:20.08,Default,,0000,0000,0000,,"我們測試我們看一下" Dialogue: 0,0:13:20.08,0:13:22.05,Default,,0000,0000,0000,,測試是真的更像是一種發展工具 Dialogue: 0,0:13:22.05,0:13:24.02,Default,,0000,0000,0000,,像這麼多的開發工具 Dialogue: 0,0:13:24.02,0:13:25.06,Default,,0000,0000,0000,,它的效力取決於 Dialogue: 0,0:13:25.06,0:13:27.01,Default,,0000,0000,0000,,不管你雅致的方式使用上 Dialogue: 0,0:13:27.01,0:13:31.00,Default,,0000,0000,0000,,所以,你會說:"好吧,讓我們看看 — — 我踢了輪胎 Dialogue: 0,0:13:31.00,0:13:33.05,Default,,0000,0000,0000,,你知道,我解雇了流覽器,我試過幾件事情 Dialogue: 0,0:13:33.05,0:13:35.10,Default,,0000,0000,0000,,(鮮花手)它工作起來 !部署它 !" Dialogue: 0,0:13:35.10,0:13:38.04,Default,,0000,0000,0000,,這顯然不是你想要的多一點騎士 Dialogue: 0,0:13:38.04,0:13:41.02,Default,,0000,0000,0000,,通過的路上,我們發現的事情之一 Dialogue: 0,0:13:41.02,0:13:43.08,Default,,0000,0000,0000,,與剛剛起步的此線上課程 Dialogue: 0,0:13:43.08,0:13:45.09,Default,,0000,0000,0000,,當 60000 人參加課程 Dialogue: 0,0:13:45.09,0:13:48.10,Default,,0000,0000,0000,,和那些人的 0.1%有問題 Dialogue: 0,0:13:48.10,0:13:50.08,Default,,0000,0000,0000,,你就可以得到 60 電子郵件 Dialogue: 0,0:13:50.08,0:13:53.08,Default,,0000,0000,0000,,必然結果是: 當您的網站使用的很多人 Dialogue: 0,0:13:53.08,0:13:55.09,Default,,0000,0000,0000,,你沒有找到一些愚蠢的 bug Dialogue: 0,0:13:55.09,0:13:57.02,Default,,0000,0000,0000,,但是,可以通過測試來找 Dialogue: 0,0:13:57.02,0:13:59.08,Default,,0000,0000,0000,,可以非常迅速生成 * 多 * 的痛 Dialogue: 0,0:13:59.08,0:14:02.02,Default,,0000,0000,0000,,另一方面,你不想被教條和說 Dialogue: 0,0:14:02.02,0:14:04.06,Default,,0000,0000,0000,,"呃,直到我們有 100%的覆蓋率和每個測試是綠色 Dialogue: 0,0:14:04.06,0:14:06.00,Default,,0000,0000,0000,,我們絕對會不船舶" Dialogue: 0,0:14:06.00,0:14:07.01,Default,,0000,0000,0000,,這也是不健康 Dialogue: 0,0:14:07.01,0:14:08.05,Default,,0000,0000,0000,,和測試品質 Dialogue: 0,0:14:08.05,0:14:10.06,Default,,0000,0000,0000,,不一定相符的發言 Dialogue: 0,0:14:10.06,0:14:11.06,Default,,0000,0000,0000,,除非你可以說 Dialogue: 0,0:14:11.06,0:14:12.07,Default,,0000,0000,0000,,關於你的測試品質 Dialogue: 0,0:14:12.07,0:14:14.03,Default,,0000,0000,0000,,只是因為你已經執行的每一條線 Dialogue: 0,0:14:14.03,0:14:17.01,Default,,0000,0000,0000,,並不意味著你測試過的有趣的案件 Dialogue: 0,0:14:17.01,0:14:18.07,Default,,0000,0000,0000,,所以,某處之間,你會說 Dialogue: 0,0:14:18.07,0:14:20.01,Default,,0000,0000,0000,,"嗯,我們可以使用覆蓋工具來標識 Dialogue: 0,0:14:20.01,0:14:23.00,Default,,0000,0000,0000,,undertested 或差測試代碼的部分 Dialogue: 0,0:14:23.00,0:14:24.07,Default,,0000,0000,0000,,我們將使用它們作為指引 Dialogue: 0,0:14:24.07,0:14:27.01,Default,,0000,0000,0000,,要排序的説明改善我們的總體信心水準" Dialogue: 0,0:14:27.01,0:14:29.02,Default,,0000,0000,0000,,但請記住,敏捷開發是擁抱變化 Dialogue: 0,0:14:29.02,0:14:30.03,Default,,0000,0000,0000,,它的處理 Dialogue: 0,0:14:30.03,0:14:32.00,Default,,0000,0000,0000,,更改的部分是事情會改變,將導致 Dialogue: 0,0:14:32.00,0:14:33.04,Default,,0000,0000,0000,,你沒有預見到的 bug Dialogue: 0,0:14:33.04,0:14:34.03,Default,,0000,0000,0000,,和正確的反應就是: Dialogue: 0,0:14:34.03,0:14:36.03,Default,,0000,0000,0000,,能自在的測試工具 Dialogue: 0,0:14:36.03,0:14:37.06,Default,,0000,0000,0000,,[這樣] 您可以快速找到這些 bug Dialogue: 0,0:14:37.06,0:14:39.02,Default,,0000,0000,0000,,寫一個轉載了這個 bug 的測試 Dialogue: 0,0:14:39.02,0:14:40.06,Default,,0000,0000,0000,,然後進行測試綠色 Dialogue: 0,0:14:40.06,0:14:41.06,Default,,0000,0000,0000,,然後你就會真的改變它 Dialogue: 0,0:14:41.06,0:14:43.00,Default,,0000,0000,0000,,這意味著,您真的修復 bug 的方式是 Dialogue: 0,0:14:43.00,0:14:45.05,Default,,0000,0000,0000,,如果您創建了一個正確的失敗的測試 Dialogue: 0,0:14:45.05,0:14:46.09,Default,,0000,0000,0000,,重現這個 bug Dialogue: 0,0:14:46.09,0:14:48.06,Default,,0000,0000,0000,,然後回到了並修復該代碼 Dialogue: 0,0:14:48.06,0:14:49.06,Default,,0000,0000,0000,,使這些測試通過 Dialogue: 0,0:14:49.06,0:14:51.07,Default,,0000,0000,0000,,同樣的你不想說 Dialogue: 0,0:14:51.07,0:14:53.04,Default,,0000,0000,0000,,"嗯,單元測試給你更好的覆蓋範圍 Dialogue: 0,0:14:53.04,0:14:54.07,Default,,0000,0000,0000,,他們是更徹底和詳細 Dialogue: 0,0:14:54.07,0:14:56.04,Default,,0000,0000,0000,,所以讓我們專注,我們所有的能量" Dialogue: 0,0:14:56.04,0:14:57.06,Default,,0000,0000,0000,,而不是 Dialogue: 0,0:14:57.06,0:14:58.09,Default,,0000,0000,0000,,"哦,重點集成測試 Dialogue: 0,0:14:58.09,0:15:00.01,Default,,0000,0000,0000,,因為他們更切合實際,對不對? Dialogue: 0,0:15:00.01,0:15:01.06,Default,,0000,0000,0000,,它們反映了客戶說他們想要什麼 Dialogue: 0,0:15:01.06,0:15:03.03,Default,,0000,0000,0000,,因此,如果通過集成測試 Dialogue: 0,0:15:03.03,0:15:05.07,Default,,0000,0000,0000,,通過定義我們滿足客戶需求" Dialogue: 0,0:15:05.07,0:15:07.03,Default,,0000,0000,0000,,同樣,這兩個極端都有點不健康 Dialogue: 0,0:15:07.03,0:15:09.08,Default,,0000,0000,0000,,因為其中的每一個可以找出問題 Dialogue: 0,0:15:09.08,0:15:11.03,Default,,0000,0000,0000,,這將由其他忽略了 Dialogue: 0,0:15:11.03,0:15:12.06,Default,,0000,0000,0000,,所以,有好的結合 Dialogue: 0,0:15:12.06,0:15:15.04,Default,,0000,0000,0000,,就是有點全部是所有關于 Dialogue: 0,0:15:15.04,0:15:18.07,Default,,0000,0000,0000,,我想要留給你們的最後一件事是,我認為 Dialogue: 0,0:15:18.07,0:15:20.04,Default,,0000,0000,0000,,方面的測試,是"與拓展署 Dialogue: 0,0:15:20.04,0:15:22.00,Default,,0000,0000,0000,,所謂傳統的調試 — — Dialogue: 0,0:15:22.00,0:15:24.00,Default,,0000,0000,0000,,即,我們都有點做的方式 Dialogue: 0,0:15:24.00,0:15:25.05,Default,,0000,0000,0000,,儘管我們說我們不要" Dialogue: 0,0:15:25.05,0:15:26.06,Default,,0000,0000,0000,,和我們都試圖右好轉嗎? Dialogue: 0,0:15:26.06,0:15:27.08,Default,,0000,0000,0000,,我們所有的在裝訂線 Dialogue: 0,0:15:27.08,0:15:29.04,Default,,0000,0000,0000,,我們中的一些正仰望星空 Dialogue: 0,0:15:29.04,0:15:31.01,Default,,0000,0000,0000,,努力提高我們的實踐 Dialogue: 0,0:15:31.01,0:15:33.10,Default,,0000,0000,0000,,但現在住這 3 或 4 年我自己 Dialogue: 0,0:15:33.10,0:15:35.09,Default,,0000,0000,0000,,和 — — 要老實 — 3 年前我沒做拓展署 Dialogue: 0,0:15:35.09,0:15:37.08,Default,,0000,0000,0000,,我現在就做,因為我發現它是更好 Dialogue: 0,0:15:37.08,0:15:40.08,Default,,0000,0000,0000,,這裡是我蒸餾的所以,我覺得很管用 Dialogue: 0,0:15:40.08,0:15:43.03,Default,,0000,0000,0000,,很抱歉,顏色是有點怪異 Dialogue: 0,0:15:43.03,0:15:45.00,Default,,0000,0000,0000,,但在左邊的列的表的 Dialogue: 0,0:15:45.00,0:15:46.03,Default,,0000,0000,0000,,[它] 說"常規調試" Dialogue: 0,0:15:46.03,0:15:47.04,Default,,0000,0000,0000,,右側說"拓展署" Dialogue: 0,0:15:47.04,0:15:49.07,Default,,0000,0000,0000,,所以我用來編寫代碼的方法是什麼? Dialogue: 0,0:15:49.07,0:15:51.06,Default,,0000,0000,0000,,也許你們中的一些仍然這樣做 Dialogue: 0,0:15:51.06,0:15:53.01,Default,,0000,0000,0000,,我寫了一大堆的行 Dialogue: 0,0:15:53.01,0:15:54.04,Default,,0000,0000,0000,,也許我們只剩下幾十行代碼 Dialogue: 0,0:15:54.04,0:15:55.06,Default,,0000,0000,0000,,我是 * 確保 * 他們正確 — — Dialogue: 0,0:15:55.06,0:15:56.06,Default,,0000,0000,0000,,我的意思是,我 * am * 一個好的程式師,正確嗎? Dialogue: 0,0:15:56.06,0:15:57.10,Default,,0000,0000,0000,,這並不難 Dialogue: 0,0:15:57.10,0:15:59.00,Default,,0000,0000,0000,,我運行它 — — 它不起作用 Dialogue: 0,0:15:59.00,0:16:01.10,Default,,0000,0000,0000,,好的調試器點燃 — — 將 printf 的開始 Dialogue: 0,0:16:01.10,0:16:04.09,Default,,0000,0000,0000,,如果就已經使用 TDD 將我做什麼而是? Dialogue: 0,0:16:04.09,0:16:08.02,Default,,0000,0000,0000,,嗯,我會寫 * 幾 * 行代碼,第一次寫了一個測試 Dialogue: 0,0:16:08.02,0:16:10.07,Default,,0000,0000,0000,,所以儘快把測試從紅色變為綠色 Dialogue: 0,0:16:10.07,0:16:12.06,Default,,0000,0000,0000,,我知道我寫了代碼的工作 — — Dialogue: 0,0:16:12.06,0:16:15.01,Default,,0000,0000,0000,,或者至少,我原本想的行為的部件 Dialogue: 0,0:16:15.01,0:16:16.10,Default,,0000,0000,0000,,行為的那些部分工作,因為我有一個測試 Dialogue: 0,0:16:16.10,0:16:19.06,Default,,0000,0000,0000,,好的回傳統的調試: Dialogue: 0,0:16:19.06,0:16:21.07,Default,,0000,0000,0000,,我正在我的程式試圖找到的 bug Dialogue: 0,0:16:21.07,0:16:23.03,Default,,0000,0000,0000,,我開始把 printf 的無處不在 Dialogue: 0,0:16:23.03,0:16:24.06,Default,,0000,0000,0000,,可以列印出來的東西值 Dialogue: 0,0:16:24.06,0:16:25.06,Default,,0000,0000,0000,,方式是很有趣 Dialogue: 0,0:16:25.06,0:16:26.07,Default,,0000,0000,0000,,當你想閱讀這些 Dialogue: 0,0:16:26.07,0:16:28.01,Default,,0000,0000,0000,,日誌輸出的 500 線出來的 Dialogue: 0,0:16:28.01,0:16:29.04,Default,,0000,0000,0000,,你會得到一個 Rails 應用程式中 Dialogue: 0,0:16:29.04,0:16:30.09,Default,,0000,0000,0000,,試圖找到 * 你 * printf 的 Dialogue: 0,0:16:30.09,0:16:32.04,Default,,0000,0000,0000,,你知道,"我知道我要做 — — Dialogue: 0,0:16:32.04,0:16:34.01,Default,,0000,0000,0000,,我要把放在 75 星號之前和之後 Dialogue: 0,0:16:34.01,0:16:36.04,Default,,0000,0000,0000,,這將使可讀"(笑聲) Dialogue: 0,0:16:36.04,0:16:38.07,Default,,0000,0000,0000,,誰不要 — — 好吧,提高你的手,如果你不這樣做 ! Dialogue: 0,0:16:38.07,0:16:40.09,Default,,0000,0000,0000,,謝謝你的誠實。(笑聲)還行。 Dialogue: 0,0:16:40.09,0:16:43.01,Default,,0000,0000,0000,,或 — — 或者我可以做其他事情,我可以說: Dialogue: 0,0:16:43.01,0:16:45.03,Default,,0000,0000,0000,,列印變數的值而不是 Dialogue: 0,0:16:45.03,0:16:47.04,Default,,0000,0000,0000,,為什麼不寫檢查它的測試 Dialogue: 0,0:16:47.04,0:16:48.08,Default,,0000,0000,0000,,在這樣的期望應該 Dialogue: 0,0:16:48.08,0:16:50.09,Default,,0000,0000,0000,,我立即知道在明亮的紅色字母 Dialogue: 0,0:16:50.09,0:16:53.03,Default,,0000,0000,0000,,如果不滿足這一期望 Dialogue: 0,0:16:53.03,0:16:56.00,Default,,0000,0000,0000,,好的我對常規調試側: Dialogue: 0,0:16:56.00,0:16:58.09,Default,,0000,0000,0000,,我打破出殺手鐧: 我拉出 Ruby 調試器 Dialogue: 0,0:16:58.09,0:17:02.04,Default,,0000,0000,0000,,我設置調試中斷點,和我現在開始 * 調整 * 說 Dialogue: 0,0:17:02.04,0:17:04.08,Default,,0000,0000,0000,,"哦,讓我們看看,我要讓過去的 if 語句 Dialogue: 0,0:17:04.08,0:17:06.00,Default,,0000,0000,0000,,所以要設置的那個東西 Dialogue: 0,0:17:06.00,0:17:07.06,Default,,0000,0000,0000,,哦,我要調用該方法,所以我需要 to…" Dialogue: 0,0:17:07.06,0:17:08.06,Default,,0000,0000,0000,,不 ! Dialogue: 0,0:17:08.06,0:17:10.09,Default,,0000,0000,0000,,我 * 能 * 相反 — — 如果我要去做,不管怎麼說 — — Dialogue: 0,0:17:10.09,0:17:13.00,Default,,0000,0000,0000,,讓我們在檔中設置一些類比考試和存根,只是做 Dialogue: 0,0:17:13.00,0:17:16.04,Default,,0000,0000,0000,,若要控制的代碼路徑,讓它就這樣的方式 Dialogue: 0,0:17:16.04,0:17:19.01,Default,,0000,0000,0000,,現在,"好吧,肯定我已經固定它 ! Dialogue: 0,0:17:19.01,0:17:22.01,Default,,0000,0000,0000,,我給出的調試器,運行它所有再次 !" Dialogue: 0,0:17:22.01,0:17:24.02,Default,,0000,0000,0000,,並且,當然,9 次滿分,你並沒有解決它 Dialogue: 0,0:17:24.02,0:17:26.07,Default,,0000,0000,0000,,或你的部分原因是固定的它,但你並沒有完全修復, Dialogue: 0,0:17:26.07,0:17:30.04,Default,,0000,0000,0000,,現在我再做這些手動都有 Dialogue: 0,0:17:30.04,0:17:32.09,Default,,0000,0000,0000,,* 或 * 我已經有一堆的測試 Dialogue: 0,0:17:32.09,0:17:34.03,Default,,0000,0000,0000,,和我可以自動他們重新 Dialogue: 0,0:17:34.03,0:17:35.06,Default,,0000,0000,0000,,可以,如果有些人不和 Dialogue: 0,0:17:35.06,0:17:36.09,Default,,0000,0000,0000,,"哦,我未修復整件事 Dialogue: 0,0:17:36.09,0:17:38.04,Default,,0000,0000,0000,,沒問題,我只是去回來 !" Dialogue: 0,0:17:38.04,0:17:39.10,Default,,0000,0000,0000,,所以,底線是, Dialogue: 0,0:17:39.10,0:17:41.10,Default,,0000,0000,0000,,你知道,你 * 能 * 做它的左側 Dialogue: 0,0:17:41.10,0:17:45.00,Default,,0000,0000,0000,,但在這兩種情況中使用相同的技術 Dialogue: 0,0:17:45.00,0:17:48.06,Default,,0000,0000,0000,,唯一不同的是,在一個案例中你正在手動 Dialogue: 0,0:17:48.06,0:17:50.00,Default,,0000,0000,0000,,這是無聊且容易出錯 Dialogue: 0,0:17:50.00,0:17:51.08,Default,,0000,0000,0000,,在其他情況下你做一些更多的工作 Dialogue: 0,0:17:51.08,0:17:53.10,Default,,0000,0000,0000,,但您可以使它自動和可重複 Dialogue: 0,0:17:53.10,0:17:55.07,Default,,0000,0000,0000,,有,你知道,一些高信心 Dialogue: 0,0:17:55.07,0:17:57.00,Default,,0000,0000,0000,,當您更改您的代碼中的東西 Dialogue: 0,0:17:57.00,0:17:58.09,Default,,0000,0000,0000,,你不打破過去工作的東西 Dialogue: 0,0:17:58.09,0:18:00.09,Default,,0000,0000,0000,,基本上,這是提高工作效率 Dialogue: 0,0:18:00.09,0:18:02.05,Default,,0000,0000,0000,,所以你正在做的事情都一樣 Dialogue: 0,0:18:02.05,0:18:04.04,Default,,0000,0000,0000,,但有一種"三角"額外工作 Dialogue: 0,0:18:04.04,0:18:07.09,Default,,0000,0000,0000,,您正在使用你的努力在多高的杠杆 Dialogue: 0,0:18:07.09,0:18:10.04,Default,,0000,0000,0000,,這樣說是我認為的種 TDD 是一件好事 Dialogue: 0,0:18:10.04,0:18:11.09,Default,,0000,0000,0000,,這是真的,這不需要新的技能 Dialogue: 0,0:18:11.09,0:18:15.01,Default,,0000,0000,0000,,它僅僅需要 [你] 重構您現有的技能 Dialogue: 0,0:18:15.01,0:18:18.01,Default,,0000,0000,0000,,也嘗試過當我 — — 再次,誠實口供,正確嗎? — — Dialogue: 0,0:18:18.01,0:18:19.03,Default,,0000,0000,0000,,當我開始做這就像 Dialogue: 0,0:18:19.03,0:18:21.05,Default,,0000,0000,0000,,"好吧,我會在滑軌上的課程教學 Dialogue: 0,0:18:21.05,0:18:22.06,Default,,0000,0000,0000,,我真的應該集中測試 Dialogue: 0,0:18:22.06,0:18:24.03,Default,,0000,0000,0000,,所以我回到我寫了一些代碼 Dialogue: 0,0:18:24.03,0:18:26.09,Default,,0000,0000,0000,,那是 * 工作 * — — 你知道,那是體面的代碼 — — Dialogue: 0,0:18:26.09,0:18:29.01,Default,,0000,0000,0000,,然後我就開始努力為它編寫測試 Dialogue: 0,0:18:29.01,0:18:31.02,Default,,0000,0000,0000,,它是 * 那麼痛苦 * Dialogue: 0,0:18:31.02,0:18:33.03,Default,,0000,0000,0000,,因為是可測試的方式並不編寫代碼 Dialogue: 0,0:18:33.03,0:18:34.10,Default,,0000,0000,0000,,有各種各樣的交互 Dialogue: 0,0:18:34.10,0:18:36.04,Default,,0000,0000,0000,,比如有嵌套的條件陳述式 Dialogue: 0,0:18:36.04,0:18:38.08,Default,,0000,0000,0000,,如果你想要找出特定語句 Dialogue: 0,0:18:38.08,0:18:41.07,Default,,0000,0000,0000,,並將它測試 — — 到觸發器測試 — — 只是該聲明 Dialogue: 0,0:18:41.07,0:18:44.00,Default,,0000,0000,0000,,你會在您測試設置的東西量 Dialogue: 0,0:18:44.00,0:18:45.01,Default,,0000,0000,0000,,發生 — — Dialogue: 0,0:18:45.01,0:18:46.04,Default,,0000,0000,0000,,請記住,當談到類比火車殘骸 — — Dialogue: 0,0:18:46.04,0:18:48.01,Default,,0000,0000,0000,,您必須設置所有此基礎結構 Dialogue: 0,0:18:48.01,0:18:49.06,Default,,0000,0000,0000,,只是為了得到 * 一個 * 代碼行 Dialogue: 0,0:18:49.06,0:18:51.02,Default,,0000,0000,0000,,和你這麼做了,你走 Dialogue: 0,0:18:51.02,0:18:52.07,Default,,0000,0000,0000,,"Gawd,測試是真的不值得 ! Dialogue: 0,0:18:52.07,0:18:54.03,Default,,0000,0000,0000,,我寫了 20 條線的安裝 Dialogue: 0,0:18:54.03,0:18:56.06,Default,,0000,0000,0000,,這樣我可以測試兩行在函數中我 !" Dialogue: 0,0:18:56.06,0:18:58.08,Default,,0000,0000,0000,,真正帶告訴你 — — 我現在意識到 — — Dialogue: 0,0:18:58.08,0:19:00.04,Default,,0000,0000,0000,,是你的函數是 * 壞 * Dialogue: 0,0:19:00.04,0:19:01.05,Default,,0000,0000,0000,,它是一個嚴重的書面的函數 Dialogue: 0,0:19:01.05,0:19:02.05,Default,,0000,0000,0000,,它不是一個可測試函數 Dialogue: 0,0:19:02.05,0:19:03.09,Default,,0000,0000,0000,,它有太多的移動部件 Dialogue: 0,0:19:03.09,0:19:06.03,Default,,0000,0000,0000,,相關性的 * 可 * 被打破 Dialogue: 0,0:19:06.03,0:19:07.07,Default,,0000,0000,0000,,我的功能中有無接縫 Dialogue: 0,0:19:07.07,0:19:11.01,Default,,0000,0000,0000,,這使我單獨測試不同的行為 Dialogue: 0,0:19:11.01,0:19:12.08,Default,,0000,0000,0000,,一旦你開始做測試第一次開發 Dialogue: 0,0:19:12.08,0:19:15.04,Default,,0000,0000,0000,,因為你要的小塊寫你的測試 Dialogue: 0,0:19:15.04,0:19:17.05,Default,,0000,0000,0000,,它使解決這個問題 Dialogue: 0,0:19:17.05,9:59:59.99,Default,,0000,0000,0000,,所以,這一直是我的頓悟