Трудно Тестване [RogueConf/RougeConf 2014]

Трудно Тестване [RogueConf/RougeConf 2014]

Лекция, в която давам примери за проблеми, при които не е съвсем очевидно как да подходим с тестването. Предлагам идеи за това как може да се подходи в подобни ситуации.

Fc59401781a26b10f5d4fc5b758fb3b7?s=128

Andrew Radev

March 30, 2014
Tweet

Transcript

  1. Трудно тестване

  2. @AndrewRadev

  3. waiting-on-rails

  4. waiting-on-rails • Подпроцес за rails, четем изхода • Подпроцес за

    музиката • Следим изхода на rails, убиваме музиката • Тестове?
  5. Стандартна формула • Приготвяме данни • Изпълняваме кода • Проверяваме

    резултата
  6. Стандартна формула • Setup • Execution • Validation

  7. Трудно тестване

  8. Vim

  9. Vim плъгини

  10. splitjoin

  11. selenium

  12. Идея 1: Имитиране на потребителя

  13. <insert haskell joke here>

  14. Идея 1: Имитиране на потребителя

  15. None
  16. Vim --servername FOO Vim --remote-send

  17. vimrunner

  18. None
  19. None
  20. FDD

  21. None
  22. class Line def draw(image) dx = (x2 – x1).to_f dy

    = (y2 – y1).to_f (x1 .. x2).each do |x| y = (y1+dy*(x-x1)/dx).round draw_point(image, x, y) end end end
  23. it "draws a slanted line" do image = make_image(100, 100)

    line = Line.new(from:[20,30], to:[80,50]) line.draw(image) Image[20,30].should eq color('black') Image[80,50].should eq color('black') end
  24. None
  25. None
  26. 1) Line#draw draws a slanted line Failure/Error: gray(image[20,30]).should eq gray(color('black'))

    expected: 0 got: 127
  27. specify "dark pixels are only on the line" do line.draw(image)

    (20 .. 80).each do |y| (30 .. 50).each do |x| tint = gray(image[x, y]) distance = line.distance(x, y).abs if distance > 1 tint.should eq gray(color('white')) elsif distance == 0 tint.should_not eq gray(color('white')) end end end end
  28. Идея 2: Тестване на характеристики на алгоритъма

  29. QuickCheck

  30. take5 :: [Char] -> [Char] take5 = take 5 .

    filter (`elem` ['a'..'e']) *A> quickCheck (\s -> length (take5 s) <= 5) OK, passed 100 tests.
  31. Произволни числа

  32. RNG

  33. Средна стойност?

  34. it "has a correct mean value" do ns = 10_000.times.map

    { get_random_number } ns.mean.round(2).should eq 0.50 end
  35. def get_random_number return 0.5 end

  36. def get_random_number # chosen by fair dice roll return 0.5

    end
  37. def get_random_number # chosen by fair (and very precise) dice

    roll return 0.5 end
  38. Chi-squared test χ2=∑ (actual i −expected i )2 expected i

  39. Kolmogorov-Smirnoff test F n (x)= брой x i стойности≤x n

  40. John Cook: “How to test a random number generator”

  41. None
  42. waiting-on-rails

  43. waiting-on-rails • Свири ли музика? • Rails правилно ли е

    стартиран?
  44. waiting-on-rails • Пуснат ли е един процес? • Стартиранo ли

    е определено binary?
  45. Идея 3: Знай какво тестваш

  46. Идея 4: Лесни и трудни тестове

  47. Благодаря

  48. None