Birim test zaman aşımı kullanarak bir yöntemin performansını ölçmek iyi bir fikir mi?


14

Belirli bir eylem için maksimum yürütme süresini belirten işlevsel olmayan gereksinimlerin olduğu bir projede , KG, gereksinimde hem donanım hem de yük belirtilen kesin yük altında kesin donanım kullanarak bu eylemin performansını özel bir makinede kontrol etmelidir.

Öte yandan, kaynak koddaki bazı hatalı değişiklikler performansı ciddi şekilde etkileyebilir. Erken bu olumsuz etki farkeden , önce kaynak kodu kaynak denetimi ulaşır ve QA departmanı tarafından doğrulandı, sorunu bildirmeden QA departmanı tarafından kaybedilen zaman açısından yararlı olacağı ve geliştirici tarafından daha sonra bunu birkaç hareketin tespit olabilir.

Bunu yapmak için iyi bir fikir mi:

  • Aynı eylemi yürütmek için harcanan zaman hakkında fikir sahibi olmak için birim testlerini² n kez,

  • C # özniteliği üzerinden sınama başına zaman aşımı kullanmak için [TestMethod, Timeout(200)]?

Bu yaklaşımla ilgili birkaç sorun bekliyorum:

  • Kavramsal olarak , birim testleri gerçekten bunun için değildir: bir kodun küçük bir kısmını test etmeleri beklenir, daha fazlası değil: ne fonksiyonel bir gereksinimin kontrolü, ne de entegrasyon testi veya performans testi.

  • Visual Studio'daki birim sınama zaman aşımı, başlatma ve temizlemenin bu sınamalar için mevcut olmadığını veya sonuçları etkilemeyecek kadar kısa olduğunu dikkate alarak ölçülmesi beklenenleri gerçekten ölçer mi?

  • Performansı bu şekilde ölçmek çirkin. Herhangi bir makinede donanım, yük vb. Bağımsız olarak bir karşılaştırma ölçütü çalıştırmak , bir veritabanı ürününün her zaman diğerinden daha hızlı olduğunu gösteren bir karşılaştırma ölçütü yapmak gibidir . Öte yandan, bu birim testlerin ne kesin sonuç ne de KG departmanı tarafından kullanılan bir şey olmasını beklemiyorum . Bu birim testleri, yalnızca beklenen performans hakkında genel bir fikir vermek ve esasen geliştiriciye son değişikliğinin performansı ciddi şekilde etkileyen bir şey kırdığı konusunda uyarmak için kullanılacaktır .

  • Teste Dayalı Geliştirme (TDD) bu testler için imkansızdır. İlk olarak, kod uygulamaya başlamadan önce nasıl başarısız olur?

  • Çok fazla performans testi, testleri çalıştırmak için gereken süreyi etkileyeceğinden, bu yaklaşım yalnızca kısa eylemlerle sınırlıdır.

Bu sorunları göz önünde bulundurarak, QA departmanının gerçek performans metrikleriyle birleştirilirse, bu tür birim testlerini kullanmayı ilginç buluyorum.

Yanlış mıyım? Bunun için birim testlerinin kullanılmasını tamamen kabul edilemez hale getiren başka problemler var mı?

Yanılıyorsam, kaynak kodu kaynak kontrolüne ulaşmadan ve KG departmanı tarafından doğrulanmadan önce, kaynak kodundaki bir değişikliğin performansı ciddi şekilde etkilediğini geliştiriciye uyarmanın doğru yolu nedir?


Unit Aslında, birim testlerinin yalnızca karşılaştırılabilir donanım performansına sahip geliştirici PC'lerde çalışması beklenir, bu da performans testinde asla başarısız olamayacak en hızlı makineler ile asla geçmeyi başaramayacak en yavaş makineler arasındaki boşluğu azaltır.

² Eylem olarak, çalıştırmak için birkaç milisaniye harcayan oldukça kısa bir kod parçası demek istiyorum.

Yanıtlar:


3

Bu yaklaşımı da kullanıyoruz, yani belirli bir makinede belirli bir yük senaryosu altında çalışma zamanını ölçen testlerimiz var. Bunları normal birim testlerine dahil etmediğimizi belirtmek önemli olabilir. Birim testleri temel olarak değişiklikleri gerçekleştirmeden önce bir geliştirici makinesindeki her geliştirici tarafından yürütülür. Bunun performans testleri için neden bir anlamı olmadığı için aşağıya bakın (en azından bizim durumumuzda). Bunun yerine, entegrasyon testlerinin bir parçası olarak performans testleri yapıyoruz.

Doğru bir şekilde işaret ettiniz, bunun doğrulamayı dışlamaması gerektiğini. Testimizin işlevsel olmayan gereksinimin bir testi olduğunu varsaymıyoruz. Bunun yerine, bunu sadece potansiyel bir sorun göstergesi olarak görüyoruz.

Ürününüzden emin değilim, ancak bizim durumumuzda, performans yetersizse, bunu "düzeltmek" için çok fazla çalışma yapılması gerektiği anlamına gelir. Bu yüzden, bunu tamamen KG'ye bıraktığımız zaman, korkunç. Ayrıca, performans düzeltmelerinin kod tabanının büyük bir kısmı üzerinde ciddi etkileri olacaktır ve bu da önceki KG işini geçersiz kılar. Sonuçta, çok verimsiz ve tatmin edici olmayan bir iş akışı.

Bununla birlikte, sorunlarınız için bazı noktalar:

  • kavramsal olarak: birim testlerin konusu bu değildir. Ancak herkesin bildiği sürece, testin KG'nin yapması gereken herhangi bir şeyi doğrulaması gerekmediği, sorun değil.

  • Visual Studio: VS'den birim test çerçevesini kullanmadığımız için bunun hakkında hiçbir şey söyleyemeyiz.

  • Makine: Ürüne bağlıdır. Ürününüz, özel bireysel masaüstü makinelerine sahip son kullanıcılar için geliştirilmiş bir şeyse, testleri farklı geliştiricilerin makinelerinde gerçekleştirmek daha gerçekçi olur. Bizim durumumuzda, ürünü belirli bir spesifikasyona sahip bir makine için teslim ediyoruz ve bu performans testlerini sadece böyle bir makinede yapıyoruz. Gerçekten de, müşteri nihayetinde 16 çekirdeği veya daha fazlasını çalıştıracağı zaman, çift çekirdekli geliştirici makinenizdeki performansı ölçmenin pek bir anlamı yoktur.

  • TDD: İlk hata tipik olsa da, bu bir zorunluluk değildir. Aslında, bu testleri erken yazmak, geleneksel bir birim testinden ziyade bir regresyon testi olarak hizmet etmesini sağlar. Testin erken başlaması sorun değil. Ancak, bir geliştirici bir şeyleri yavaşlatan işlevsellik eklediğinde, işlevsel olmayan performans gereksiniminin farkında olmadığından, bu TDD testinin bunu fark edeceği avantajını elde edersiniz. Çok oluyor ve harika bir geri bildirim. Günlük işinizde: kod yazıyorsunuz, taahhüt ediyorsunuz, öğle yemeğine gidiyorsunuz ve geri döndüğünüzde, derleme sistemi, ağır yük ortamında yürütüldüğünde bu kodun çok yavaş olduğunu söylüyor. TDD testinin başlangıçta başarısız olmadığını kabul etmem için yeterince güzel.

  • Çalışma zamanı: Belirtildiği gibi, bu testleri geliştirici makinelerinde değil, bir tür entegrasyon testinde derleme sisteminin bir parçası olarak yapıyoruz.


3

Ben çoğunlukla senin düşüncelerinde inline oldum. Sadece aklımı bağımsız akışla ortaya koymak.

1. Daha iyi / daha hızlı hale getirmeden önce çalışmasını
sağlayın Kod herhangi bir performans ölçümü (garanti vermeden) sunmadan önce, ilk önce doğru şekilde yapılmalıdır, yani işlevsel olarak çalışmasını sağlayın. İşlevsel olarak yanlış olan kodu optimize etmek sadece zaman kaybı değildir, aynı zamanda gelişime engel olur.

2. Bir sistemin performansı yalnızca tam sistem için
anlamlıdır Tipik olarak, herhangi bir anlamlı performans her zaman verilen bir altyapıya bağlıdır ve yalnızca tam bir sistem altında görülmelidir. Örneğin, sahte test sırasında modül yerel bir metin dosyasından yanıt alırsa ancak üretim ortamında veritabanından alırsa,

3. Performans ölçeklendirmesi objektif olarak yapılmalıdır
Fonksiyonel sisteme sahip olduktan sonra, sistemin performansını analiz etmeniz ve performansı nerede ölçeklendirmeniz gerektiğini anlamak için darboğazlar bulmanız gerekir. Tam bir sistemin performansını bilmeden önce bile her yöntemi körü körüne optimize etmeye çalışmak gereksiz miktarda iş gerektirebilir (önemli olmayan yöntemleri optimize edebilir) ve kodunuzu gereksiz yere şişirebilir.

Visual studio işlevselliğinin farkında değilim, ancak genellikle daha geniş profil oluşturma aracına ihtiyacınız var.


2

Bir süre önce benzer bir görevim vardı ve son çözüm, birim testi ile tam gelişmiş otomatik performans testi arasında ortada bir yerdeydi.

Yararlı olabilecek belirli bir sırada olmayan bazı hususlar:

  • KG tarafından yapılan performans testi emek yoğundu ve kendi programına sahipti (örneğin, yinelemede bir kez), bu yüzden kaynak kontrolüne çarpmak bir sorun değildi.
  • Sistemimiz büyük ve modülerdi, birim testleri ihtiyaçlarımız için çok ayrıntılıydı ve belirli ilgi alanlarındaki performans sorunlarını tetiklemek için dikkatle hazırlanmış özel "yağ" birim testleri oluşturduk (bunlar da kategorize edildi, ancak bu bir uygulama ayrıntısı).
  • Birim testleri için genel kısıtlamalar hala geçerlidir: küçük, hızlı ve noktaya gelmelidir.
  • Test çerçevesi etkisini dışlamak için, özel bir sarıcı tarafından çalıştırıldılar, bu nedenle verilen işlemin ne kadar zaman aldığını tam olarak biliyorduk .
  • Gerçek uygulama tamamlanmadan bunları yazmak mümkündür (sonuçlar, sürece bağlı olarak, belki de geliştiriciler hala uygulamayı deniyor ve genel olarak nasıl gittiğini görmek istiyorlar) ilgisiz veya yararlı olabilir.
  • Her derlemeden sonra CI sunucusu tarafından çalışıyorlardı , bu nedenle toplam çalışma süresi nispeten kısa tutulmalıdır (eğer böyle değilse, sorunu tetikleyen kesin değişikliği belirlemek oldukça zorlaşır).
  • CI sunucusu güçlü ve donanım sabitlenmişti, bu yüzden bunu adanmış makine olarak saydık (uzak bir yapı aracısı kullanarak gerçekten adanmış sunucu kullanmak mümkündür).
  • Test sarmalayıcısı, ilgili tüm bilgileri (donanım özellikleri, test adları / kategorileri, sistem yükü, geçen süre, vb.) Topladı ve raporlar veya veritabanına aktardı.
  • JIRA için bu raporları çeken ve bazı kontrollerle (önceki sürüme geçme, vb.) Yer alan isme / kategoriye / yapı numarasına göre güzel grafikler çizerek bir gadget'ımız vardı, böylece geliştiriciler etkilerini hızlı bir şekilde görebilir ve yöneticiler genel bir bakış elde edebilir (bazıları kırmızı, hepsi yeşil, bilirsiniz, onlar için önemlidir).
  • Toplanan istatistikleri kullanarak projenin zaman içinde nasıl gittiğini analiz etmek mümkün oldu.

Sonuçta, özel gereksinimlerimizi çabucak ayarlayabilen ölçeklenebilir, esnek ve öngörülebilir bir sistemimiz vardı. Ancak, uygulanması biraz çaba gerektiriyordu.

Sorulara dönüyoruz. Kavramsal olarak birim testleri bunun için değildir, ancak test çerçevenizin özelliklerinden yararlanabilirsiniz. Test zaman aşımlarını hiçbir zaman ölçüm aracı olarak görmedim, sadece askıda kalma ve benzeri şeyler için bir güvenlik ağı. Ancak mevcut yaklaşımınız sizin için işe yarıyorsa, kullanmaya devam edin, pratik olun. İhtiyaç duyulursa daha sonra her zaman fantezi olabilirsiniz.


0

Bence iyi gidiyorsun. Bu tam olarak birim test zaman aşımlarına sahip olmanın noktasıdır: bir şeyin yolunda olup olmadığını kontrol etmek , olması gerekenden daha uzun. Bu yaklaşımın sınırlamaları vardır, ancak bunların zaten farkında gibi görünüyorsunuz, bu sınırlamaları göz önünde bulundurduğunuz sürece bir sorun görmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.