D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: 简单的单元测试框架

yidabu 2007-4-28 19:12

简单的单元测试框架

简单的单元测试框架知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070428点击下面网址查看原文:http://www.d-programming-language-china.org        by:        qiezi        from:        http://qiezi.javaeye.com/blog/69732        做了个简单的单元测试框架,只算个毛坯,遇到一些问题。        1、由于没有完整的堆栈跟踪,所以无法打印出断言失败的行号。        2、无法获得行号,成功、失败或异常都需要显示这个。        3、由于unittest关键字后面的块是一个函数,所以把这个单元测试放在里面时,成了内嵌类,这时D禁止调用static ctor。当然这不算是个大问题。        只做了简单输出,没什么实际用途。代码如下:        [Copy to clipboard] [ - ]CODE:                                class TestCase                {                    public                    template TestCases(Methods ...)                    {                        static this()                        {                            typeof(this) instance = new typeof(this);                            instance.setUp();                            instance.beginTest((typeof(this)).classinfo.name);                            mixin (_TestCases!(Methods));                            instance.endTest();                            instance.tearDown();                        }                    }                                    protected:                                    void setUp(){}                                    void tearDown(){}                                    void beginTest(char[] classname)                    {                        this.classname = classname;                    }                                    void endTest()                    {                    }                                    void assertEqual(T,U)(T t, U u)                    {                        bool pass = (t == u);                        addTestResult(classname, methodname, pass, std.string.format("assertEqual(", t, ", ", u, ")"));                    }                                    void assertNotEqual(T,U)(T t, U u)                    {                        bool pass = (t != u);                        addTestResult(classname, methodname, pass, std.string.format("assertNotEqual(", t, ", ", u, ")"));                    }                                    private:                    void beginMethodTest(char[] methodname)                    {                        this.methodname = methodname;                    }                                    void endMethodTest()                    {                                    }                                    void runTest(lazy void dg)                    {                        writefln("runTest: " ~ methodname);                        try                        {                            dg();                        }                        catch(Exception ex)                        {                            addTestException(classname, methodname, ex);                        }                    }                                    void addTestResult(char[] classname, char[] methodname, bool pass, char[] info)                    {                        writefln("in ", classname, ".", methodname, " ", info, ", result: ", pass);                    }                                    void addTestException(char[] classname, char[] methodname, Exception ex)                    {                        writefln("in ", classname, ".", methodname, " ", ex);                    }                                    template _TestCases(Methods ...)                    {                        static if (Methods.length > 0)                        {                            const char[] _TestCases =                                "instance.beginMethodTest(\"" ~ Methods[0] ~ "\");\n" ~                                "instance.runTest(instance." ~ Methods[0] ~ "());\n" ~                                "instance.endMethodTest();\n" ~                                _TestCases!(Methods[1..$]);                        }                        else                        {                            const char[] _TestCases = "";                        }                    }                                    char[] classname;                    char[] methodname;                }                                import std.stdio;                                class MathTest : TestCase                {                    mixin TestCases!(                        "testFoo",                        "testBar"                    );                                    void setUp()                    {                        writefln("setUp");                    }                                    void tearDown()                    {                        writefln("tearDown");                    }                                    void testFoo()                    {                        assertEqual(1, 1);                        assertNotEqual(1, 0);                    }                                    void testBar()                    {                        assertEqual(1, 0); // must fail                        assertNotEqual(1, 1); // must fail                    }                }                                void main()                {                }                输出:        QUOTE:                                setUp                runTest: testFoo                in unittest.MathTest.testFoo assertEqual(1, 1), result: true                in unittest.MathTest.testFoo assertNotEqual(1, 0), result: true                runTest: testBar                in unittest.MathTest.testBar assertEqual(1, 0), result: false                in unittest.MathTest.testBar assertNotEqual(1, 1), result: false                tearDown        ( lastupdate:20070428 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: 简单的单元测试框架