Я участвую в додзё TDD Coding, где мы пытаемся отработать чистый TDD на простых задачах. Однако мне пришло в голову, что код, полученный из модульных тестов, не самый эффективный. Теперь это нормально в большинстве случаев, но что, если использование кода растет, и эффективность становится проблемой.
Мне нравится, как код получается из модульного тестирования, но возможно ли сделать так, чтобы свойство эффективности появилось в ходе дальнейших тестов?
Вот тривиальный пример в ruby: простая факторизация. Я следовал чистому подходу TDD, заставляя тесты проходить один за другим, подтверждая мой первоначальный приемочный тест (прокомментированный внизу).
Какие дальнейшие шаги я мог бы предпринять, если бы я хотел, чтобы появился один из общих алгоритмов простой факторизации ? Чтобы уменьшить проблемную область, скажем, я хочу получить реализацию quadratic sieve ... Теперь в этом точном случае я знаю «оптимальный алгоритм», но в большинстве случаев клиент просто добавляет требование, что функция выполняется менее чем за «х» времени для данной среды.
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
edit 1 Судя по первым ответам, мне кажется, я не совсем понял в своем первоначальном описании: тест производительности не стандартная часть моего модульного теста, это новый приемочный тест , написанный для ответа на особое требование от клиента.
edit 2 Я знаю, как проверить время выполнения, но кажется, что переход от тривиального алгоритма к оптимизированному - огромный шаг. Мой вопрос заключается в том, как сделать оптимальный код emerge , другими словами: как вы декомпозируете переход от тривиального кода к оптимальному?
Некоторые упоминали, что это подход к проблеме: я предоставил пример проблемы, для которой я не знаю, как продолжить.