2010-06-05 5 views
4

누군가가 문제에 대한 해결책을 작성해야한다고 가정하고 몇 가지 테스트를 통해 해결책을 테스트해야합니다. 그의 프로그램이 내 모든 테스트를 통과 할 수는 있지만 (아마도 반성 또는 무언가로) 문제에 대한 실제 해결책과 아무런 공통점이 없습니까?단위 테스트를 항상 통과시키는 방법은 무엇입니까?

+0

그런 일이 발생했습니다. 이 사이트를 방문하여 숙제를 더 많이 또는 적게하는 대신에 실제로 학생 코드를 읽는 방법을 찾는 조교가있을 것 같습니다. (@brain_damage을 공격을하지 마십시오.) – bmargulies

+2

@bmargulies을 내 CS 프로그램을 알고 적어도 종종 자동화 학년을 사용하는 조교가 필요합니다. 따라서 brain_damage가 학년일지도 모르지만, 그것은 그가 "속이고있다"는 것을 의미하지는 않습니다. 그는 단지 호기심을 가질 수 있습니다. –

+0

@Matt 나는 그 이유 때문에 '속임수'라는 단어를 피했다. – bmargulies

답변

5

일반적인 경우 일반 케이스

, 아니. 테스트를 올바르게 구현했는지 알지 못하기 때문에 숙제를 제대로 수행하지 않아도 테스트를 통과 할 수 있습니다. 학생들이 테스트를 실행할 수있는 경우

특별 케이스

, 그들은 학습 알고리즘을 사용할 수 있습니다.

학생이 테스트의 소스 코드에 액세스 할 수있는 경우 리플렉션을 사용하여 예상 결과를 변수에 저장하는 것과 같은 속임수를 찾을 수 있습니다. 소스 코드 트릭을 찾을 수 없으면 테스트를 컴파일하고 실행할 수 있습니다.

학생들이 테스트의 바이트 코드에 액세스 할 수 있으면 학생들은이를 분해하고 소스 코드 트릭을 사용할 수 있습니다. 당신이 효과적으로 obsfuscated하더라도, 그들은 여전히 ​​그것을 실행할 수 있습니다.

학생들이 다른 학생 코드와 비교하여 학생 코드를 테스트한다는 것을 알게되면, 그들이 수행해야하는 모든 작업이 일관성있게 수행됩니다.

권장

  1. 는 학생들에게 시험을 사용할 수 있도록하지 마십시오. 그들은 독립적으로 숙제를 테스트해야합니다. 공식 평가를 위해 숙제를 제출 한 후 테스트를 실행하십시오.
  2. 테스트를 더욱 강력하게 만들기 위해 임의 화를 사용하십시오.
  3. 테스트에서 학생 코드와 다른 학생 코드를 비교하면 모든 실패를 수동으로 조사해야합니다. 어쩌면 한 학생이 올바르게 구현되었고 다른 학생은 잘못된 구현을 복사했을 수도 있습니다. 이 경우 다수 규칙은 무능력을 보상합니다.
  4. 당신은 자신의 테스트를 수집하고 자신의 테스트를 테스트 할 수 있습니다.
+0

좋은 답변입니다. ACM-ICPC와 같은 프로그래밍 경연 대회에서 경쟁 업체는 하나 또는 두 개의 테스트 케이스가 주어 지지만 완전히 다른 테스트 케이스가 코드 테스트에 사용됩니다. 코드 케이스는 학생들에게 공개되지 않습니다. 학생이 모든 테스트 케이스를 받았다면 실제 알고리즘을 작성하지 않고 입력에 대해보고 싶은 것을 반환 할 수 있지만 합당한 조치를 취하면 피할 수 있습니다. – JFA

1

확실히. 테스트에 대한 소스 코드가 없어도 ASM과 같은 바이트 코드 조작기 또는 디 컴파일러를 사용하여 입력과 원하는 응답을 상관시킬 수 있습니다.

0

JUnit 4에서는이 방법에 사용되는 @Ignore 주석이 있습니다

@Ignore 
@Test 
public void testSmth() { 
    ... 
} 

을하지만 난 당신이 설명한 상황을 영상화하기 위해 노력하고있어. 그리고 내가 할 수있는 유일한 일은 ACM 문제 검증 자 (예 : PC^2)와 같은 것입니다.

그리고이 경우 테스트를 위해 코드를 호출하면 흐름을 완전히 제어 할 수 있습니다. 따라서 사용자는 이런 방식으로 속임수를 쓰지 않을 것입니다.

0

절대적으로입니다.

학생들이 테스트에서 찾고있는 것을 발견하면 숙제 문제를 해결하지 않고도 그 결과를 생성하는 코드를 작성할 수 있습니다.

반사? 예상되는 결과를 변수로 유지한다면 그렇습니다. 인라인 상수를 읽을 수 있는지 확실하지 않습니다. 그러나 관계없이 보안 관리자가있는 샌드 박스에서 코드를 실행하십시오. 어쨌든 그렇게하고 싶다면 : 코드가 악의적이거나 의도하지 않은 결과가 있다면 어떻게해야할까요?

+0

아니면 포인터가 아주 많아서 프로그래머가 아니기 때문에 무료로 사용하지 마십시오 ... – JFA

관련 문제