2013-02-21 2 views
3

내 main.cs 코드 :테스트 실행 제한 시간을 초과

public string Generate(int length) 
{ 
    char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray(); 
    string password = string.Empty; 
    Random random = new Random(); 

    for (int i = 0; i < length; i++) 
    { 
     int x = random.Next(1, chars.Length); 

     if (!password.Contains(chars.GetValue(x).ToString())) 
      password += chars.GetValue(x); 
     else 
      i--; 
    } 
    return password; 
} 

제가 테스트 코드를

[TestMethod] 
[Timeout(1000)] 
public void RenderingPasswordShouldHaveMaximumSize() 
{ 
    var amountOfCharacters = Int32.MaxValue; 
    var generator = new PasswordGenerator(); 
    var target = generator.Generate(amountOfCharacters); 

    Assert.Fail("This method should throw an exception if you try to create a password with too many characters"); 
} 

을 가지고하지만 나에게 다음과 같은 오류 제공 :

Message: Test 'RenderingPasswordShouldHaveMaximumSize' exceeded execution timeout period

수를 누군가 날 도와 줘? 내 비밀번호의 최대 크기는 74이어야합니다.

+5

당신의'Generate' 메쏘드는 너무 길어서 암호를 생성하는데 의심 스럽습니다. – LukeHennerley

+0

코드를 통해 디버깅하려고 시도 할 수 있습니다. – bas

+0

경고로서 질문을 부인하지 마십시오.이 작업을 다시 수행하면 계정이 잠기고 계정이 일시 중지됩니다. –

답변

7

방금 ​​테스트를 오래 걸리려는 것으로 나타났습니다. Int32.MaxValue 부분을 무시하십시오.

루프가 약간 이상합니다. 모든 문자를 사용하고 시도하기 위해 반복기를 감소 시키지만 문제가 발생할 수 있습니다. 너무 오랜 시간이 걸리는 것은 아니지만 실제로 암호를 올바르게 생성하지는 않습니다.

나는이 같은 버전를 해결하는 것입니다 :

static string Generate(int length) 
{ 
    // also, seed your random so you don't get the same password 
    Random random = new Random((int)DateTime.Now.Ticks); 

    char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray(); 
    string password = string.Empty; 

    for (int i = 0; i < chars.Length; i++) 
    { 
     int x = random.Next(0, chars.Length); 

     if (!password.Contains(chars.GetValue(x).ToString())) 
      password += chars.GetValue(x); 
     else 
      i--; 
    } 

    if (length < password.Length) password = password.Substring(0, length); 
    return password; 
} 

나는이 테스트를했는데 그것은 작동 :

테스트 코드 :

Debug.WriteLine(Generate(5)); 
Thread.Sleep(50); 

Debug.WriteLine(Generate(10)); 
Thread.Sleep(50); 

Debug.WriteLine(Generate(20)); 
Thread.Sleep(50); 

Debug.WriteLine(Generate(30)); 
Thread.Sleep(50); 

Debug.WriteLine(Generate(40)); 
Thread.Sleep(50); 

Debug.WriteLine(Generate(60)); 
Thread.Sleep(50); 

그리고 결과 :

SDxF0 
i8ZLhm1gxn 
@0Ldn7I&1:Kg2x3SYE;m 
U?5uO%N4hkpq1*y;9SRVaer^Eij:bT 
nvL;E3#D1MQgTicSdojHOwz:VFk2x&94a*[email protected] 
cSm39n:%1sL*[email protected]^pazH$JXiQ;tFg  

또한 암호에 문자를 추가하는 방식을 염두에두면 문자가 char[]의 모든 문자를 사용하지만 반복이 없도록 만듭니다. 즉, 비밀번호의 최대 길이는 char[]의 길이와 같습니다.

나는 이런 식으로 뭔가 추천 할 것입니다 : 같은 결과를 얻을 수

static string Generate(int length) 
{ 
    Random random = new Random((int)DateTime.Now.Ticks); 
    StringBuilder sb = new StringBuilder(); 

    for (int i = 0; i < length; i++) 
    { 
     int x = random.Next(33, 123); 
     sb.Append((char)x); 
    } 

    return sb.ToString(); 
} 

을뿐만 아니라 더 긴 길이를 처리 할 수와 같은 200 :

t5[5l 
WoEZG;8^9< 
6(4Q*Y7k>`?ohte6F^pe 
DVb\5l^JMKc`q&[#$U4Kq^\OW`JrRi 
#iQSq0\WRoDe<]k36nOhNOb-#"Zt!cK8iaR.I>VF 
1<%^"B)6bZhWEiazmfmO7Vv*Rw]TbKV+GRJUc%k23Lq/[email protected]& 
jOnV_`(Cf$I\kFr/%%/loG"bx9lV1E?`[A"y1)pF5tA".x?**(E/>kzCN-XGnL2B`c!JEtxw0cXu'zTztcM*z0CkBYK%LIRcbz<Fxo`0*HzU4&=NTXM,z)[email protected])fJtKa2o3'_/#&#=zR1iW<<wLnwFdYXg&hgta0x:C?m6jEVH*])[email protected],UJr*59)VkUrG8J& 
+0

내가 100으로 변경하면; 그것은 여전히 ​​나에게 오류를 제공합니다 –

+0

내 최신 업데이 트를 참조하십시오, 당신은 루프에 결함이있었습니다. 암호의 길이는 나중에 결정되어야하며 루프는 원하는 암호가 아닌 char 배열의 길이를 사용해야합니다. –

+1

감사합니다 그것은 나를 위해 작동합니다! –

1

무엇 그냥이 추가에 대한 :

if (length > chars.Length) { 
    throw new ArgumentException("Password too long", length); 
} 

테스트 결과이 Exception이 예상대로 throw되는지 확인할 수 있습니다.

74보다 작은 숫자를 전달하지 않으면 코드가 이되지 않습니다.이 완료됩니다.

코드에 따르면 임의로 선택한 문자가 이미 암호에있는 경우 다시 반복 만합니다 (i 감소).

chars의 모든 문자를 사용하면 어떻게 될지 생각 했습니까?

+2

+1, 멋지게 발견되었습니다. 그래도 내 제안은 암호에 한 번 이상 들어갈 수 있습니다. :) – Default

+0

OP가 반복되는 문자를 원하지 않는다면 여전히 추천 할 수 있습니다. –

관련 문제