2017-12-08 11 views
1

これは、クラスで初期化されたランダムな名前を生成する必要があるexorcism.ioの練習です。クラスの2つのインスタンス間でランダムな文字列が同じであるため、ユニットテストケースの1つが失敗しています。 unittestの外でコードを実行すると、正しく動作するように見えます。 varがunittest内の同じアドレス空間を指している可能性はありますか?python3クラスはunittestで同じランダム値を生成します

import string 
import random 
import unittest 


class Robot(object): 
    def __init__(self): 
     self.name = None 
     self.reset() 
     print('Name at Init', self.name) 

    def reset(self): 
     for _ in range(5): 
      new = random.choice(string.ascii_uppercase) + random.choice(string.ascii_uppercase) + str(random.randint(100, 999)) 

     self.name = new 


class SimpleTest(unittest.TestCase): 
    if not hasattr(unittest.TestCase, "assertRegex"): 
     assertRegex = unittest.TestCase.assertRegexpMatches 

    name_re = r'^[A-Z]{2}\d{3}$' 

    def test_names(self): 
     # Set a seed 
     seed = "This is some seed text" 

     # Initialize RNG using the seed 
     random.seed(seed) 

     # Call the generator 
     robot = Robot() 
     name = robot.name 

     # Reinitialize RNG using seed 
     random.seed(seed) 

     # Call the generator again 
     robot.reset() 
     name2 = robot.name 
     self.assertNotEqual(name, name2) 
     self.assertRegex(name2, self.name_re) 



if __name__ == '__main__': 
    unittest.main() 
    # print(Robot().name == Robot().name) # Returns False 



F 
Name at Init WY294 
====================================================================== 
FAIL: test_names (__main__.SimpleTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/.......robot.py", line 42, in test_names 
    self.assertNotEqual(name, name2) 
AssertionError: 'WY294' == 'WY294' 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 

答えて

1

テストでシードを2番目に呼び出します。乱数ジェネレータは、与えられたシードに対して常に同じシーケンスを生成するので、シードを2回呼び出すことでシーケンスを巻き戻しているので、同じ値が得られます。

関連する問題