2017-09-30 10 views
2

우리는 git에서 프로젝트를 유지 관리하기 위해 트래비스 CI를 사용합니다. 오류가있을 경우 문제는 여기에 우리가 사양의 임의의 선택 서로 다른 씨앗 번호가 각각의 실행이 개 프로세스가 트래비스에, 지금은 실행하려고 :bisect에서 최소한의 재생 명령을 사용하지 않아도 Rspec은 오류를 재현 할 수 없습니다.

  1. 씨앗 번호
  2. 와 정확한 사양 시드 번호가없는 정확한 사양은
  3. 시드 번호
  4. 시드 번호 사양 파일과 함께 사양 파일은 시드 번호없이하지만 --bisect
  • 사양 파일을 --bisect3210

    travis 빌드를 디버깅 할 때 로컬 이건 ssh 이건간에 위의 5 가지 시나리오에서 나는 실패를 발견하지 못하고 bisect는 항상 실패합니다.

    또한 완전히 다른 시나리오에서 parallel : spec을 로컬로 기본 8 프로세스와 함께 실행하면 오류가 발생하지만 'rspec'cmd를 사용하여 각각을 단독 실행하면 오류가 발생하지 않습니다.

    필자는 응용 프로그램의 루트에있는 .parallel-spec 파일에 --bisect 옵션이있는 동안 병렬로 실행하려고 시도했습니다. 내가 얻는 최소한의 재생 명령은 여전히 ​​실패를주지 않는다.

    무엇이 여기에 있습니까? 이 문제는 여러 프로세스를 실행하고 rspec을 사용하여 최소한의 재생 행을 실행해야합니까? 현재 스펙이 1 개 이상의 프로세스에서 실행되는 경우 실패한 스펙을 재현 할 수없는 것으로 보입니다. 반면에 로컬로 rspec --bisect를 실행하면 8 시간 후에도 1 프로세스가 시작되지 않았 음을 알 수 있으며 MacBook Pro를 사용하고 있습니다. (예 : 약 4k 사양입니다.)

    p.s. 우리는 레일 4.2.7.1, 루비 2.3.3 및 RSpec에 3.4.4

    감사

    업데이트에있어 : ​​사양 순서를 얻을 병렬 사양은 상세 실행 한 다음 사양이 실패하는 프로세스 명령을 실행 시드 번호와 시드 번호 그리고 --bisect. 여전히 실패는 없습니다. 당신은 내가 당신의 사양이 서로 간섭 및 사양 A가 사양 B 전에 실행되는 경우, 그것은 B가 실패합니다 가능성이 Try to run all the specs from the process with the seed

    볼 수없는 시도하는 5 가지 사항 중

  • 답변

    0

    ... 또는 A가 B보다 먼저 실행 되더라도 C가 실패 할 수 있습니다.

    시드와 함께 하나의 프로세스에서 모든 사양을 실행하면 실패를 재현 할 수 있습니다. 그러면 --bisect과 동일한 작업을 실행하여 실패한 가장 작은 세트를 찾습니다.

    그런 식으로 재생할 수 없다면 다른 옵션이 나타날 수 있습니다. 병렬 사양은 공유 리소스 (DB, 파일)를 사용하고 있으며 장애는 경쟁 조건으로 인해 발생합니다. 그것들은 찾기가 어렵습니다. 특히 스펙 중에서. 각 프로세스가 실제로 별도의 DB를 사용하는지 확인하십시오 (database.yml을 변경하는 것을 잊어 버리는 것처럼 간단한 오류가 발생할 수 있습니다).

    그래도 도움이되지 않는다면 코드에서 다른 가능한 공유 리소스를 검사하십시오. 대개 얼마나 많은 스펙이 실패하는지는 언급하지 않았습니다. 그것이 작은 숫자라면 - 그것들에 집중할 수 있습니다.

    +0

    감사합니다.실제로 어제는 시드를 사용하는 과정에서 사양을 실행하고 시드와 이등분을 사용하여 또 다른 시간을 실행 해 보았습니다.하지만 여전히 실패는 없었습니다. 지금 바로 그 부분을 업데이트했습니다. 실패에 대해서는 유감스럽게도 내가 불행하게도 병렬로 실행할 때마다 새로운 오류가 발생하고 실제로 이러한 개별 오류 대부분을 개별적으로 해결했습니다. 사양을 병렬로 실행하고있을 때 모든 것이 혼란스러워서 결론에 이르게됩니다. 이는 spec 파일 내의 건전성 때문일 수 있습니다. – Shalaby

    +0

    나는 각 프로세스가 예상대로 별도의 DB를보고 db를 조사했습니다. 나는 병렬 프로세스의 측면에서 각 스펙을 자체 오브젝트로 분리해야하며 오브젝트를 전역으로 선언하고 모든 스펙에서 사용하지 않아야한다고 생각합니다. 아마도 모든 사양을 리팩터링해야 할 것입니다. 그러나 여기서는 병렬 실행에 대한 Bakir의 기사에서 얻었습니다. https://www.atlantbh.com/blog/parallel-test-execution/ 이제는 정확하게 파일을 공유하지 않습니다. 사양하지만 개체를 ​​공유하고 있습니다. 이 이론을 테스트하고 리팩토링을 시작할 것입니다. – Shalaby

    +0

    프로세스간에 객체를 어떻게 공유하고 있습니까? – meta