2017-12-30 7 views
0

DNS 쿼리로 몇 가지 테스트를 수행하는 테스트를 만들려고합니다. 나는 최소한의 테스트를 만들려고, 그 청취 DNS 서버를 발사하고,이 서버 쿼리 트위스트 해결 프로그램을 사용하여 다음과 같은 오류이 시험 결과를 실행시험판 테스트 DNS 쿼리로 인해 원자로가 더러운 상태가됩니다.

from twisted.trial import unittest 

from twisted.internet import reactor, defer 
from twisted.names import client, dns, error, server 


class Tester(unittest.TestCase): 
    def setUp(self): 
     self.resolver = client.Resolver(resolv='/etc/resolv.conf') 
     self.resolver = client.Resolver(servers=[('127.0.0.1', 1025)]) 
     self.factory = server.DNSServerFactory(clients=[self.resolver]) 
     self.protocol = dns.DNSDatagramProtocol(controller=self.factory) 
     self.port = reactor.listenUDP(1025, self.protocol) 

    def tearDown(self): 
     self.port.stopListening() 

    def test_test(self): 
     def callback(ignore): 
      print("Received callback!") 
     res = client.createResolver(servers=[('127.0.0.1', 1025)], resolvconf='/dev/null', hosts='/dev/null') 
     d = res.lookupAddress('foobar.com') 
     d.addCallback(callback) 

을 :

[ERROR] 
Traceback (most recent call last): 
Failure: twisted.trial.util.DirtyReactorAggregateError: Reactor was unclean. 
DelayedCalls: (set twisted.internet.base.DelayedCall.debug = True to debug) 
<DelayedCall 0x7f44c69042e8 [0.9992678165435791s] called=0 cancelled=0 
DNSMixin._clearFailed(<Deferred at 0x7f44c6904358>, 28457)> 
<DelayedCall 0x7f44c68f3e10 [59.99872899055481s] called=0 cancelled=0 Resolver.maybeParseConfig()> 

test.Tester.test_test 

================================================================== 
[ERROR] 
Traceback (most recent call last): 
Failure: twisted.trial.util.DirtyReactorAggregateError: Reactor was 
unclean. 
Selectables: 
<<class 'twisted.names.dns.DNSDatagramProtocol'> on 34529> 

test.Tester.test_test 
------------------------------------------------------------------------------- 
Ran 1 tests in 0.003s 

을 따라서 반응기가 test_test의 확인자가 보낸 메시지에서 지워지지 않는 것으로 보입니다.

왜 이런 일이 발생하는지 이해할 수 없습니다. 문서에 따르면 재판을 통해 원자로가 가동되고 만져서는 안된다고합니다. 테스트 프레임 워크를 잘못 사용합니까?

답변

0

아마도 테스트 스위트에서 실제 네트워크 트래픽을해서는 안됩니다. 실제 네트워크는 불안정하고 테스트 스위트는 오류가 발생하기 쉽고 좌절감을 불러 일으키는 경향이 있습니다. systemd-resolved가 업데이트되어 시스템을 돌아 다니는 일부 DNS 트래픽에 이상한 일을하기 시작했기 때문에 테스트 실행이 실패하는 것을 원하지는 않습니다.

실제 네트워크 트래픽을 피하기위한 주요 전략은 실제 네트워크를 사용하지 않는 구현 인 테스트 대상보다 한 수준 아래에 인터페이스를 대체 구현하는 것입니다. 내가 할 수있는 전략은 간단한 메모리 내 객체를 사용하여 네트워크 비헤이비어를 모방하는 것입니다. 원하는 경우 실제 및 메모리 구현 모두에 대해 낮은 수준의 테스트 스위트를 실행할 수 있으며 두 가지 구현이 적어도 어느 정도는 "동일"하다는 것을 확인할 수 있습니다.

즉, tearDown에는 간단한 버그가 있습니다. Deferred을 반환하는 stopListening을 호출하지만 Deferred은 반환하지 않습니다. 따라서 시험판 결정은 tearDown이 반환되지만 아직 완료되지 않았을 때 수행됩니다. stopListeningDeferred을 반환하면 중 하나가 부정확 한 오류를 피할 수 있습니다.

test_test에 유사한 버그가 있습니다. d을 반환하지 않으므로이 메서드는 메서드가 반환 되 자마자 테스트가 끝났음을 (성공적으로) 결정합니다. d을 반환하고 d 화재가 발생하면 테스트가 끝났음을 결정합니다 (성공한 결과가 발생하면 테스트를 통과합니다).

관련 문제