2010-07-27 17 views
8

Tüm çıktıları günlüğe kaydetmek için python günlüğe kaydetme modülünü kullanmak istiyorum, böylece yazmayı denediğim bir test çerçevesine dahil edebilirim. Bunun amacı, testlerin 2 set çıktı ile çalıştırılmasıdır; biri basit bir çıktı ile test durumu adımlarını ve daha fazla hata ayıklama seviyesi çıktısını verir, böylece işler ters gittiğinde mümkün olduğunca fazla bilgiye sahip oluruz. Çıktı, insanlara e-posta gönderebildiğim, diğeri de hata durumunda tutulan iki dosyaya yerleştirilecek. TextTestRunner'ın bir stream kullanabileceğini fark ettim, bu logging modülü ile kullanılabilir mi? Python 2.7'deki yeni özelliklerden bazılarını kullanmayı planlıyorum.Kayıt modülünü python'da en uygun modül ile nasıl kullanabilirim?

cevap

1

Yapabilirsin, ama senin en iyi yaklaşımın olduğundan emin değilim. Bu yaklaşım için

, olur:

  1. TextTestRunner tarafından kullanılabilecek bir bellek içi akışı başlatır. Bu, io.StringIO'un neredeyse mükemmel olacağı bir şeydir, yalnızca Unicode girdisi ile çalıştığı ve TextTestRunner'ın Unicode'u düzgün bir şekilde akışa yazdığından emin değilim. Diğer seçeneğiniz, amacınıza hizmet eden kendi bellek içi akışınızı kodlamak ve belki de bir kodlayıcıyla StringIO'u sarmak olabilir.

  2. Kendi TextTestRunner'ınızı oluşturun ve bu bellek içi akışla başlatın.

  3. Akıştan okuyan ve günlüğüne yazan bir sınıf oluşturun. Bu yaklaşım ile

    class StreamLogger(object): 
        def __init__(self, input_stream, output_logger): 
         self.input_stream = input_stream 
         self.output_logger 
        def run(self): 
         while True: 
          line = input_stream.readline() 
          if not line: 
           break 
          output_logger.error(line) 
    

    Sorunları:

Bu kadar basit olabilir Sen fazla yok

  • eğer farklı etmek TextTestRunner çıkışının farklı bölümlerini yönlendiren herhangi esneklik günlük seviyeleri.
  • TextTestRunner, yanlış yapılandırılmışsa, muhtemelen istemediğiniz bir sürü şey yazacaktır. Varsayılan ayrıntı, test ederken ilerleme noktaları yazacak olan 1'dir. Bu, muhtemelen sadece çıkış kaydında yolunuza girecektir.
  • Eğer bunu çok iyi yaparsanız, tüm çıktınızı akışa yazdıktan sonra stream_logger.run()'u arayacaksınız. Böylece, günlüğe kaydetme çıktısını gerçek zamanda almazsınız ve günlüğe kaydetme zaman damgalarınız işe yaramaz. Örneğin, okumak için ayrı bir iş parçacığı oluşturarak bunu çözebilirsiniz, ancak aynı anda çalışan bir okuyucu ve yazıcı iş parçacığını işleyebilecek bir akış seçmeniz/döndürmeniz veya bir işlemi iptal etmeniz ve bellek içi akışı atlatmanız gerekiyorsa, ya da nispeten karmaşık bir şey. diyelim ki, denilen, LoggingTestRunner - - çıkış tam olarak istediğiniz şekilde günlükçüsüne Test çıktı yazıyor

yerine öneririm yaklaşım akışları vazgeçmek ve sadece kendi test koşucu geri almaktır. Bu, bu sorunların üçünü önlemenizi sağlayacaktır.

+0

Teşekkürler. Yapmam gereken şeylerin bir kısmı için neye ihtiyacım varmış gibi geliyor. – user197674

İlgili konular