Non dirò che la casualità è una cattiva idea.
[Sav07] ha testato l'implementazione dell'algoritmo per la ricerca binaria scrivendo un gruppo di test che includeva alcune "teorie" (ipotesi) su come l'algoritmo di ricerca doveva eseguire.
Quindi ha eseguito il gruppo "completo" di test con un sacco di proiettori casuali.
In Ruby:
require "test/unit"
require "binary_search" # binary_search gem:
# <https://github.com/tyler/binary_search>
class BinarySearchTestTheories < Test::Unit::TestCase
def before_all
@rand = Random.new()
end
def test_theories
experiments = 1000
max_value = 1073741824 # Fixnum max value
while (experiments-- > 0) do
test_array = generateRandomSortedArray
target_must_exist = [true, false].sample
if target_must_exist
target = test_array[@rand.rand(test_array.length)]
elsif
target = @rand.integer(max_value)
end
return_value = test_array.binary_search { |v| target <=> v }
assert_theory1(test_array, target, return_value)
assert_theory2(test_array, target, return_value)
assert_theory3(test_array, target, return_value)
assert_theory4(test_array, target, return_value)
end
end
# Theories
def assert_theory1(arr, target, expectation) ... end
def assert_theory2(arr, target, expectation) ... end
def assert_theory3(arr, target, expectation) ... end
def assert_theory4(arr, target, expectation) ... end
# Helper
def does_array_contain_target?(arr, target) ... end
def target_position(arr, target) ... end
end
Non sono sicuro che le sue "teorie sui test" si qualificano come test di accettazione, ma sono chiaramente al di là dei test unitari o di "limite".
La mia conclusione: i test di accettazione casuale sono utili per algoritmi prevedibili. Le e-mail di campionamento e le impostazioni dei nomi utente sembrano abbastanza banali.
[Sav07] Alberto Savoia: "Beautiful Tests", in: Andy Oram e Greg Wilson (a cura di): Beautiful Code , Beijing: O'Reilly, 2007.
Vedi l'articolo completo all'indirizzo: link