我參加了一個TDD編碼Dojo,我們嘗試在簡單問題上練習純TDD。然而,我發現單元測試中出現的代碼並不是最有效的。現在大多數情況下都沒問題,但是如果代碼使用量增加,那麼效率就成了問題。如何通過單元測試產生高效的代碼?
我喜歡代碼從單元測試中出現的方式,但是有可能通過進一步的測試使效率屬性出現嗎?
這裏是一個紅寶石的例子:素因子分解。我遵循純粹的TDD方法,使得測試一個接一個地驗證我的原始驗收測試(在底部註釋)。 如果我想讓generic prime factorization algorithms之一出現,我還能採取哪些步驟?爲了減少問題領域,我們假設我想要實現一個quadratic sieve ...現在在這種精確的情況下,我知道「最優算法,但在大多數情況下,客戶端只會添加一個要求, x」的時間,特定的環境。
require 'shoulda'
require 'lib/prime'
class MathTest < Test::Unit::TestCase
context "The math module" do
should "have a method to get primes" do
assert Math.respond_to? 'primes'
end
end
context "The primes method of Math" do
should "return [] for 0" do
assert_equal [], Math.primes(0)
end
should "return [1] for 1 " do
assert_equal [1], Math.primes(1)
end
should "return [1,2] for 2" do
assert_equal [1,2], Math.primes(2)
end
should "return [1,3] for 3" do
assert_equal [1,3], Math.primes(3)
end
should "return [1,2] for 4" do
assert_equal [1,2,2], Math.primes(4)
end
should "return [1,5] for 5" do
assert_equal [1,5], Math.primes(5)
end
should "return [1,2,3] for 6" do
assert_equal [1,2,3], Math.primes(6)
end
should "return [1,3] for 9" do
assert_equal [1,3,3], Math.primes(9)
end
should "return [1,2,5] for 10" do
assert_equal [1,2,5], Math.primes(10)
end
end
# context "Functionnal Acceptance test 1" do
# context "the prime factors of 14101980 are 1,2,2,3,5,61,3853"do
# should "return [1,2,3,5,61,3853] for ${14101980*14101980}" do
# assert_equal [1,2,2,3,5,61,3853], Math.primes(14101980*14101980)
# end
# end
# end
end
和天真的算法,我創造了這個方法
module Math
def self.primes(n)
if n==0
return []
else
primes=[1]
for i in 2..n do
if n%i==0
while(n%i==0)
primes<<i
n=n/i
end
end
end
primes
end
end
end
編輯1從第一個答案來看,我想我並不清楚我的初始描述:性能測試是不是是我單元測試的一個標準部分,它是一個新驗收測試編寫回答特定要求從客戶端。
編輯2我知道如何測試執行時間,但它似乎從簡單的算法轉移到優化的算法是一個巨大的步驟。我的問題是如何使最優代碼emerge,換句話說:你如何分解從平凡代碼到最優代碼的遷移? 一些人提到這是一個問題的具體方法:我提供了一個示例問題,我不知道如何繼續。
會很好,但無論設計正確的代碼還是有效的代碼,單元測試都不會顯示出現的屬性。一個給定的單元測試可以通過許多非常**不同的實現來滿足。 – Ray 2010-04-14 01:18:24
如果你對Ruby感到滿意,那麼你根本不在意perf :-)如果你真的關心perf,那麼你一定知道它必須通過爲perf設計來實現,這意味着思考需要很長的時間並且很努力。這使得TDD成爲了性能的致命的敵人 - 因爲TDD旨在專注於「今天爲我做了些什麼」並縮短了交付時間。 – ZXX 2010-08-08 15:14:03
是不是「爲perf設計」最終形式過早優化? :) 此外,我在例子中使用紅寶石,因爲它很容易閱讀。這只是爲了例子,而不是我的問題的對象。 – Jean 2010-08-08 17:57:10