Path: csiph.com!feeder.erje.net!1.eu.feeder.erje.net!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!.POSTED.2001-4dd6-fc1c-0-99db-d3d2-25a-5210.ipv6dyn.netcologne.de!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: Bit packed array Date: Thu, 4 Oct 2018 12:07:41 +0200 Organization: news.netcologne.de Distribution: world Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Thu, 4 Oct 2018 10:07:41 -0000 (UTC) Injection-Info: newsreader4.netcologne.de; posting-host="2001-4dd6-fc1c-0-99db-d3d2-25a-5210.ipv6dyn.netcologne.de:2001:4dd6:fc1c:0:99db:d3d2:25a:5210"; logging-data="30338"; mail-complaints-to="abuse@netcologne.de" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.0 In-Reply-To: Content-Language: en-US Xref: csiph.com de.comp.lang.java:13212 Responding to Heiner Kücker: > Am Montag, 1. Oktober 2018 09:46:50 UTC+2 schrieb Patrick Roemer: >> Aber interessieren würde mich schon... >> ...wie man zu Unit Tests kommt, die tagelang laufen?! > > Die Ursache ist die kombinatorische Explosion. > > public void testFromArrayCopy_All() > { > for ( int dataElementWidth = 1 ; dataElementWidth < Integer.SIZE ; dataElementWidth++ ) > { > for ( int arraySize = 1 ; arraySize <= 37 ; arraySize++ ) > { > for ( int srcPos = 0 ; srcPos < arraySize ; srcPos++ ) > { > for ( int dstPos = 0 ; dstPos < arraySize ; dstPos++ ) > { [...] "The number of input and output combinations for trivial programs is surprisingly large. It is astronomical for typical programs and beyond comprehension for typical systems. [...] Clearly, we can never test all inputs, states, or outputs." Robert V. Binder, Testing Object-Oriented Systems §3.3: The Limits of Testing Das ist sehr gründlich gedacht, aber effektiv hast Du damit ja gar keine Tests, weil niemand sie je (komplett) laufen lassen wird. Unit Tests sollten eigentlich sogar nach jeder in sich abgeschlossenen Code-Änderung automatisiert durchlaufen; das kannst Du mit diesem Ansatz komplett knicken. Üblicherweise wählt man für Unit Tests Szenarien mit (Kombinationen von) Extremen oder besonders hervorgehobenen Elementen aus dem erlaubten Bereich der Eingabewerte (hier etwa: 0, 1, Integer.SIZE,...) und einige mehr oder minder zufällige Werte, die pars pro toto für die sonstige Bandbreite stehen. Ergänzen kann man das durch randomisierte Tests a la QuickCheck[1]. Da gibt es wohl auch diverse Java-Ports; keine Ahnung, wie es sich damit arbeitet. Viele Grüße Patrick [1] http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html