为 TAOCP Knuth 的介绍性练习测试计数器
Testing a counter for an introductory exercise for TAOCP Knuth
Donald Knuth 的计算机编程艺术第 1 卷第一章中的练习 - 与使用 Euclid 的 gcd 算法取余数步骤的平均值有关。我的代码 return 完美地符合 GCD 并且已经过测试。我无法达到 return 剩余步骤,我的第二个测试标记为失败测试,代码中有注释无法获得正确的剩余步骤,并且只会 return 1 用于 gcdTestObject 上的 gcdRemainerSteps。
require 'minitest/autorun'
class GCDTest < Minitest::Test
def test_euclid_gcd
gcdTestObject=GCD.new(20,5)
assert gcdTestObject.euclidGcd==5
assert gcdTestObject.gcdRemainderSteps==1
end
def test_euclid_two
gcdTestObject=GCD.new(13,8)
assert gcdTestObject.euclidGcd==1
#Failing TEST Passes on 1 not on 5
assert gcdTestObject.gcdRemainderSteps==5
end
end
class GCD
attr_accessor :m,:n
def initialize(m,n)
@m=m
@n=n
end
def euclidGcd
r= @m % @n
until r==0
@m=@n
@n=r
r= @m % @n
end
return @n
end
def gcdRemainderSteps
r=@m % @n
counter=1
until r==0
counter+=1
@m=@n
@n=r
r=@m % @n
end
return counter
end
end
我编写的第二段代码用于测试 until 程序中的计数,效果非常好,并且完美地通过了所有测试。
并且这个 returns 计数器如预期的那样为 100,并且测试是绿色的。
#until_loop_test.rb
require 'minitest/autorun'
class Until_test < Minitest::Test
def test_till_100_steps
myUntilTestObject=UntilTester.new
assert myUntilTestObject.untilLoopCount==100
end
end
class UntilTester
def untilLoopCount
x=0
counter=0
until x==100
x+=1
counter+=1
end
return counter
end
end
也许 GCD 的方法不应该修改其成员。 gcdRemainderSteps()
仅在euclidGcd()
修改了成员变量后调用。
我做了这个修改,测试通过了:
def euclidGcd
m = @m
n = @n
r = m % n
until r==0
m = n
n = r
r = m % n
end
return n
end
测试结果:
# Running:
..
Finished in 0.001809s, 1105.5202 runs/s, 2211.0405 assertions/s.
2 runs, 4 assertions, 0 failures, 0 errors, 0 skips
Donald Knuth 的计算机编程艺术第 1 卷第一章中的练习 - 与使用 Euclid 的 gcd 算法取余数步骤的平均值有关。我的代码 return 完美地符合 GCD 并且已经过测试。我无法达到 return 剩余步骤,我的第二个测试标记为失败测试,代码中有注释无法获得正确的剩余步骤,并且只会 return 1 用于 gcdTestObject 上的 gcdRemainerSteps。
require 'minitest/autorun'
class GCDTest < Minitest::Test
def test_euclid_gcd
gcdTestObject=GCD.new(20,5)
assert gcdTestObject.euclidGcd==5
assert gcdTestObject.gcdRemainderSteps==1
end
def test_euclid_two
gcdTestObject=GCD.new(13,8)
assert gcdTestObject.euclidGcd==1
#Failing TEST Passes on 1 not on 5
assert gcdTestObject.gcdRemainderSteps==5
end
end
class GCD
attr_accessor :m,:n
def initialize(m,n)
@m=m
@n=n
end
def euclidGcd
r= @m % @n
until r==0
@m=@n
@n=r
r= @m % @n
end
return @n
end
def gcdRemainderSteps
r=@m % @n
counter=1
until r==0
counter+=1
@m=@n
@n=r
r=@m % @n
end
return counter
end
end
我编写的第二段代码用于测试 until 程序中的计数,效果非常好,并且完美地通过了所有测试。
并且这个 returns 计数器如预期的那样为 100,并且测试是绿色的。
#until_loop_test.rb
require 'minitest/autorun'
class Until_test < Minitest::Test
def test_till_100_steps
myUntilTestObject=UntilTester.new
assert myUntilTestObject.untilLoopCount==100
end
end
class UntilTester
def untilLoopCount
x=0
counter=0
until x==100
x+=1
counter+=1
end
return counter
end
end
也许 GCD 的方法不应该修改其成员。 gcdRemainderSteps()
仅在euclidGcd()
修改了成员变量后调用。
我做了这个修改,测试通过了:
def euclidGcd
m = @m
n = @n
r = m % n
until r==0
m = n
n = r
r = m % n
end
return n
end
测试结果:
# Running:
..
Finished in 0.001809s, 1105.5202 runs/s, 2211.0405 assertions/s.
2 runs, 4 assertions, 0 failures, 0 errors, 0 skips