On 08/24/2016 09:25 AM, Seb wrote:
On Wednesday, 24 August 2016 at 12:00:32 UTC, Andrei Alexandrescu wrote:
On 08/24/2016 04:14 AM, Edwin van Leeuwen wrote:
I might be dense, but the only other thing than integration tests that I
can think of is if you use random data for testing, but that would be
more correctly solved by using more random data during the unittests.
Nothing is worse than tests that only sometimes fail.

Randomized unit testing is a respected approach to testing:
https://hackage.haskell.org/package/QuickCheck,
https://github.com/rickynils/scalacheck,
https://blogs.msdn.microsoft.com/dsyme/2008/08/08/fscheck-0-2/, etc.
Some of the Phobos tests I wrote use it (and virtually all of my
current code e.g. on median computation), and when they fail I just
print the seed of the RNG and then hardcode it to reproduce the test.
-- Andrei

Do you remember that there is a pending PR for this at Phobos that is
blocked because of missing feedback / acceptance?

https://github.com/dlang/phobos/pull/2995

I know. What I need to write:

unittest
{
    void theFunctionToTest(Gen!(int, 1, 5) a, Gen!(float, 0.0, 10.0) b)
    {
        // This will always be true
        assert(a >= 1 && a <= 5);
        assert(a >= 0.0 && a <= 10.0);

        // super expensive operation
        auto rslt = (a + b);
        doNotOptimizeAway(rslt);

        debug
        {
            assert(rslt > 1.0);
        }
    }

    benchmark!theFunctionToTest();
}

What I want to write:

@Benchmark(ParamDomain!1(1, 5), ParamDomain!2(0, 10), Aggregate.median)
void theFunctionToTest(int a, float b)
{
    // This will always be true
    assert(a >= 1 && a <= 5);
    assert(a >= 0.0 && a <= 10.0);

    // super expensive operation
    auto rslt = (a + b);
    doNotOptimizeAway(rslt);
    debug
    {
        assert(rslt > 1.0);
    }
}

Attributes are a very attractive (if not the best) way to set up benchmarks. There are a variety of Java benchmarking frameworks we could draw inspiration from, see list at http://stackoverflow.com/questions/7146207/what-is-the-best-macro-benchmarking-tool-framework-to-measure-a-single-threade. Take a look e.g. at https://github.com/google/caliper/blob/master/examples/src/main/java/examples/BitSetBenchmark.java, which is so clear and simple.


Andrei

Reply via email to