CINXE.COM
SoftwareTesting - The Battle for Wesnoth Wiki
<!DOCTYPE html> <html class="client-nojs" lang="en" dir="ltr"> <head> <meta charset="UTF-8"/> <title>SoftwareTesting - The Battle for Wesnoth Wiki</title> <script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script> <script>(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"SoftwareTesting","wgTitle":"SoftwareTesting","wgCurRevisionId":71867,"wgRevisionId":71867,"wgArticleId":6202,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Development"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"SoftwareTesting","wgRelevantArticleId":6202,"wgRequestId":"a6635362c97e992aa41267b0","wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgWikiEditorEnabledModules":[]});mw.loader.state({"site.styles":"ready","noscript":"ready","user.styles":"ready","user":"ready","user.options":"ready","user.tokens":"loading","ext.CookieWarning.styles":"ready","mediawiki.legacy.shared":"ready","mediawiki.legacy.commonPrint":"ready","mediawiki.sectionAnchor":"ready"});mw.loader.implement("user.tokens@15y0z4f",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({"editToken":"+\\","patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); });mw.loader.load(["site","mediawiki.page.startup","mediawiki.user","mediawiki.hidpi","mediawiki.page.ready","mediawiki.toc","mediawiki.searchSuggest","ext.CookieWarning","skins.wesmere.js"]);});</script> <link rel="stylesheet" href="/load.php?debug=false&lang=en&modules=ext.CookieWarning.styles%7Cmediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.sectionAnchor&only=styles&skin=Wesmere"/> <script async="" src="/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=Wesmere"></script> <meta name="ResourceLoaderDynamicStyles" content=""/> <link rel="stylesheet" href="/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=Wesmere"/> <meta name="generator" content="MediaWiki 1.31.16"/> <meta name="description" content="The Wesnoth project uses a few different software testing systems. Especially for graphical and layout features, we use the test scenario, a highly decorated test scenario with a ton of graphical features that we can click around in to quickly spot problems. For non-graphical issues, we also have automated tests. We (loosely) term these unit tests. In the software development industry at large, a unit test normally refers to a small, quick test of a single class or method. Unit tests guarantee that each unit is working individually. They are particularly valuable when used with continuous integration, allowing us to catch regressions as they occur. For continuous integration, we currently use GitHub Actions."/> <link rel="shortcut icon" href="/favicon.ico"/> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch_desc.php" title="The Battle for Wesnoth Wiki (en)"/> <link rel="EditURI" type="application/rsd+xml" href="https://wiki.wesnoth.org/api.php?action=rsd"/> <link rel="alternate" type="application/atom+xml" title="The Battle for Wesnoth Wiki Atom feed" href="/index.php?title=Special:RecentChanges&feed=atom"/> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="stylesheet" type="text/css" href="https://www.wesnoth.org/wesmere/css/wesmere-1.2.0.css" /> <script src="https://www.wesnoth.org/wesmere/js/modernizr.js"></script> <link rel="apple-touch-icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/apple-touch-icon.png" sizes="180x180" /> <link rel="icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/favicon-32.png" sizes="32x32" /> <link rel="icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/favicon-16.png" sizes="16x16" /> <meta name="theme-color" content="#0f1421" /> <!--[if lt IE 9]><script src="/load.php?debug=false&lang=en&modules=html5shiv&only=scripts&skin=Wesmere&sync=1"></script><![endif]--> </head> <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-SoftwareTesting rootpage-SoftwareTesting skin-Wesmere action-view"><div class="mw-cookiewarning-container"><div class="mw-cookiewarning-text"><span>Cookies help us deliver our services. By using our services, you agree to our use of cookies.</span><form method="POST"><input name="disablecookiewarning" class="mw-cookiewarning-dismiss" type="submit" value="OK"/></form></div></div> <div id="main"> <div id="nav" role="banner"> <div class="centerbox"> <div id="logo"> <a href="https://www.wesnoth.org/" aria-label="Wesnoth logo"></a> </div> <ul id="navlinks"> <li><a href="https://www.wesnoth.org/">Home</a></li> <li><a href="https://forums.wesnoth.org/viewforum.php?f=62">News</a></li> <li><a href="https://wiki.wesnoth.org/Play">Play</a></li> <li><a href="https://wiki.wesnoth.org/Create">Create</a></li> <li><a href="https://forums.wesnoth.org/">Forums</a></li> <li><a href="https://wiki.wesnoth.org/Project">About</a></li> </ul> <div id="sitesearch" role="search"> <form method="get" action="/index.php"> <input id="searchbox" type="search" name="search" placeholder="Search" value="" title="Search this wiki [Alt+Shift+f]" accesskey="f" /> <span id="searchbox-controls"> <button id="search-go" class="search-button" type="submit" title="Search"> <i class="search-icon" aria-hidden="true"></i> <span class="sr-label">Search this wiki</span> </button> </span> </form> </div> <div class="reset"></div> </div> </div> <div id="content" class="mw-content" role="main"> <a id="top"></a> <div id="wm-wiki-toolbar" role="toolbar"><ul class="wm-toolbar" role="toolbar" aria-label="Wiki"><li id="ca-nstab-main" class="selected"><a href="/SoftwareTesting" role="button" title="View the content page [c]" accesskey="c"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">Page</span></a></li><li id="ca-talk" class="new"><a href="/index.php?title=Talk:SoftwareTesting&action=edit&redlink=1" rel="discussion" role="button" title="Discussion about the content page (page does not exist) [t]" accesskey="t"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">Discussion</span></a></li><li id="ca-history"><a href="/index.php?title=SoftwareTesting&action=history" role="button" title="Past revisions of this page [h]" accesskey="h"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">History</span></a></li><li id="wm-places-menu" class="wm-dropdown"><a class="wm-dropdown-trigger" href="#" title="Places" role="button"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">Places</span><i class="wm-toolbar-dropdown-marker" aria-hidden="true"></i></a><ul class="wm-dropdown-menu" role="menu"><li id="n-mainpage-description"><a href="/Main_Page" role="menuitem" title="Visit the main page [z]" accesskey="z"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Main page</span></a></li><li id="n-recentchanges"><a href="/Special:RecentChanges" role="menuitem" title="A list of recent changes in the wiki [r]" accesskey="r"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Recent changes</span></a></li><li id="n-randompage"><a href="/Special:Random" role="menuitem" title="Load a random page [x]" accesskey="x"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Random page</span></a></li><li id="n-help-mediawiki"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents" role="menuitem"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Help about MediaWiki</span></a></li></ul><li id="wm-advanced-menu" class="wm-dropdown"><a class="wm-dropdown-trigger" href="#" title="Advanced" role="button"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">Advanced</span><i class="wm-toolbar-dropdown-marker" aria-hidden="true"></i></a><ul class="wm-dropdown-menu" role="menu"><li id="ca-viewsource"><a href="/index.php?title=SoftwareTesting&action=edit" role="menuitem" title="This page is protected. You can view its source [e]" accesskey="e"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>View source</span></a></li><li id="t-whatlinkshere"><a href="/Special:WhatLinksHere/SoftwareTesting" role="menuitem" title="A list of all wiki pages that link here [j]" accesskey="j"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>What links here</span></a></li><li id="t-recentchangeslinked"><a href="/Special:RecentChangesLinked/SoftwareTesting" rel="nofollow" role="menuitem" title="Recent changes in pages linked from this page [k]" accesskey="k"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Related changes</span></a></li><li id="t-specialpages"><a href="/Special:SpecialPages" role="menuitem" title="A list of all special pages [q]" accesskey="q"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Special pages</span></a></li><li id="t-permalink"><a href="/index.php?title=SoftwareTesting&oldid=71867" role="menuitem" title="Permanent link to this revision of the page"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Permanent link</span></a></li><li id="t-info"><a href="/index.php?title=SoftwareTesting&action=info" role="menuitem" title="More information about this page"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Page information</span></a></li></ul></ul><ul class="wm-toolbar" role="toolbar" aria-label="User"><li id="wm-account-menu" class="wm-dropdown"><a class="wm-dropdown-trigger" href="#" title="Your account" role="button"><i class="wm-toolbar-icon" aria-hidden="true"></i><span class="sr-label">Not logged in</span><i class="wm-toolbar-dropdown-marker" aria-hidden="true"></i></a><ul class="wm-dropdown-menu" role="menu"><li id="pt-login"><a href="/index.php?title=Special:UserLogin&returnto=SoftwareTesting" role="menuitem" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><i class="wm-toolbar-icon" aria-hidden="true"></i><span>Log in</span></a></li></ul></ul></div> <!-- wm-wiki-toolbar --> <h1 class="firstHeading" lang="en">SoftwareTesting</h1> <div id="bodyContent"> <div id="siteSub">From The Battle for Wesnoth Wiki</div> <div id="contentSub"></div> <!-- start wikipage --> <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class="mw-parser-output"><p>The Wesnoth project uses a few different software testing systems. Especially for graphical and layout features, we use the <b>test scenario</b>, a highly decorated test scenario with a ton of graphical features that we can click around in to quickly spot problems. For non-graphical issues, we also have automated tests. We (loosely) term these <b>unit tests</b>. In the software development industry at large, a unit test normally refers to a small, quick test of a single class or method. Unit tests guarantee that each unit is working individually. They are particularly valuable when used with continuous integration, allowing us to catch regressions as they occur. For continuous integration, we currently use <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/actions/workflows/ci-main.yml">GitHub Actions</a>. </p><p>This page is meant to explain how to use the tests and how to add new tests. </p> <div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a> <ul> <li class="toclevel-2 tocsection-2"><a href="#The_test_scenario"><span class="tocnumber">1.1</span> <span class="toctext">The test scenario</span></a></li> <li class="toclevel-2 tocsection-3"><a href="#C.2B.2B_unit_tests_.28game_engine_and_API.29"><span class="tocnumber">1.2</span> <span class="toctext">C++ unit tests (game engine and API)</span></a></li> <li class="toclevel-2 tocsection-4"><a href="#WML_unit_tests_.28WML.2FLua_API.29"><span class="tocnumber">1.3</span> <span class="toctext">WML unit tests (WML/Lua API)</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-5"><a href="#Submitting_unit_tests_with_patches"><span class="tocnumber">2</span> <span class="toctext">Submitting unit tests with patches</span></a></li> <li class="toclevel-1 tocsection-6"><a href="#How_to_add_C.2B.2B_unit_tests"><span class="tocnumber">3</span> <span class="toctext">How to add C++ unit tests</span></a> <ul> <li class="toclevel-2 tocsection-7"><a href="#Pro_tip"><span class="tocnumber">3.1</span> <span class="toctext">Pro tip</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-8"><a href="#How_to_add_WML_unit_tests"><span class="tocnumber">4</span> <span class="toctext">How to add WML unit tests</span></a></li> <li class="toclevel-1 tocsection-9"><a href="#See_also"><span class="tocnumber">5</span> <span class="toctext">See also</span></a></li> </ul> </div> <h2><span class="mw-headline" id="Overview">Overview</span></h2> <p>The test systems which we currently use are: </p> <h3><span class="mw-headline" id="The_test_scenario">The test scenario</span></h3> <p>Located at <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/tree/master/data/test/scenarios/manual_tests/scenario-test.cfg"><code>data/test/scenarios/manual_tests/scenario-test.cfg</code></a>. </p><p>This is the default scenario used when <code>wesnoth</code> is run in test mode. This can be launched by running: </p> <pre>./wesnoth -t </pre> <p>The test scenario can also be launched from the main menu. To do this, you need to first open preferences and assign a hotkey to the "Start Test Scenario" action, which has no default assignment. Once you've assigned a hotkey, you can press it while at the main menu to bring up a list of known test scenarios. The test scenario is identified as simply "test". </p><p>Other interactive test scenarios can be started in the same way – either using the hotkey, or by adding their ID after <code>-t</code> on the command-line. Most interactive test scenarios are found either in <code>data/test/scenarios/manual_tests</code> or in <code>data/ai/scenarios</code>. The AI test scenarios are set up to be demos for various AI features. </p> <h3><span id="C++_unit_tests_(game_engine_and_API)"></span><span class="mw-headline" id="C.2B.2B_unit_tests_.28game_engine_and_API.29">C++ unit tests (game engine and API)</span></h3> <p>Located at <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/tree/master/src/tests"><code>src/tests/</code></a>. </p><p>These can be run by compiling the <b>test suite executable</b>, one of the possible targets when compiling with SCons or CMake. You will need to have the <b>Boost.Test</b> library development files installed, and, in CMake's case, pass <code>-DENABLE_TESTS=ON</code> during configuration. </p> <pre># Building with SCons: scons boost_unit_tests # Building with CMake: cmake .. -DENABLE_TESTS=ON make boost_unit_tests # Running the test suite from the root dir (one above data): # (Adjust if using a separate build dir) ./run_boost_tests </pre> <h3><span id="WML_unit_tests_(WML/Lua_API)"></span><span class="mw-headline" id="WML_unit_tests_.28WML.2FLua_API.29">WML unit tests (WML/Lua API)</span></h3> <p>Located at <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/tree/master/data/test/scenarios"><code>data/test/scenarios/</code></a> in a variety of subfolders. Note that the tests in <data/tests/scenarios/manual_tests are <i>not</i> unit tests. </p><p>These are Wesnoth test scenarios which contain events which run at the start, perform sanity checks, and then report victory or defeat immediately depending on the results. They are not meant to be interactive. They are run using the main <b>Wesnoth game executable</b>, by means of a script. On Unix-based systems, this script is <code>run_wml_tests</code> located at the root of the repository. See the forums for alternative scripts/a method to add this to your Visual Studio project file. </p> <pre>./run_wml_tests </pre> <p>By default, this runs all tests listed in the <code>wml_test_schedule</code> file. Or you can run a specific individual test with the following command: </p> <pre>./wesnoth -u id_of_test </pre> <h2><span class="mw-headline" id="Submitting_unit_tests_with_patches">Submitting unit tests with patches</span></h2> <p>It is not mandatory in the project to accompany any patch with unit tests, however it is very welcome and encouraged, especially for patches that includes changes or additions to the engine's internal APIs or the public WML/Lua API. For many kinds of patches unit tests aren't appropriate, but it's always good practice to find ways to test your code. Submitting tests with your code helps to ensure that your contribution will keep working in the future, and makes everything easier to maintain. </p><p>Similarly, if you add new graphical features, it might be a good idea to add them to the graphical test scenario. </p> <h2><span id="How_to_add_C++_unit_tests"></span><span class="mw-headline" id="How_to_add_C.2B.2B_unit_tests">How to add C++ unit tests</span></h2> <p>To add a C++ unit test, create a .cpp file in <code>src/tests/</code>. A suitable template to start with might be <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/src/tests/test_config.cpp"><code>src/tests/test_config.cpp</code></a>. </p><p>In the simplest case, you just have to do the following things: </p><p>0. Include the boost unit test framework. </p> <pre>#include <boost/test/unit_test.hpp> </pre> <p>1. Declare a "boost auto test suite" and give it an appropriate name. An auto test suite is a bundle of tests. </p> <pre>BOOST_AUTO_TEST_SUITE( test_my_feature ) [...] BOOST_AUTO_TEST_SUITE_END() </pre> <p>2. Declare any number of test cases <i>inside</i> the test suite. A test case is <code>BOOST_AUTO_TEST_CASE( ... )</code> with an identifier as the argument, followed by a C++ method body. The method body should contain statements like <code>BOOST_CHECK_EQUAL( ... , ... )</code>. All of the checks should pass when the function is executed. </p><p>For an example, you might check <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/src/tests/test_config.cpp"><code>src/tests/test_config.cpp</code></a>. </p><p>Please consult the Boost.Test docs for other styles of checks that you can use: </p> <ul><li><a rel="nofollow" class="external free" href="http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/tutorials/hello-the-testing-world.html">http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/tutorials/hello-the-testing-world.html</a></li> <li><a rel="nofollow" class="external free" href="http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/utf.html">http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/utf.html</a></li></ul> <p>3. Finally, add entries for your new .cpp file in <code>source_lists/boost_unit_tests</code> alongside the other test .cpp files, to ensure that it is compiled as part of the test executable. You do <b>not</b> need to register your test cases in any other way, as the unit testing framework will execute all of the tests that it finds. If you are using Xcode, also add your tests to the project file and include them in the unit tests target. Not doing this will not block your code from being merged – someone else will add it later on. </p><p><br /> If a check fails, you will generally get the suite, the test case name, and the line number and the exact expression that prompted the fault. <code>BOOST_CHECK_EQUAL</code> will also give you the mismatched values. If the test code segfaults, you might get just the test case name, or only get the test suite name. </p> <h3><span class="mw-headline" id="Pro_tip">Pro tip</span></h3> <p>If you have many test cases which test an object which is very complicated to construct, and you don't want to construct and destroy it repeatedly, then you should use a "global fixture", which essentially puts the object at file scope where it will be available to all the test cases in the suite when they run. It's better to use the boost fixture system than to just put it at file scope, because then the boost system knows what is going on, and can report problems more easily. (There are probably other reasons as well.) </p><p>You can see an example of a global fixture being used in <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/src/tests/test_mp_connect.cpp"><code>src/tests/test_mp_connect.cpp</code></a>. </p> <h2><span class="mw-headline" id="How_to_add_WML_unit_tests">How to add WML unit tests</span></h2> <p>To add a WML unit test, make a test scenario .cfg file and place it in the appropriate subdirectory under <code>data/test/scenarios/</code>. Any wesnoth scenario using the <code>[test]</code> tag can be a valid unit test. However, there are some macros to make writing unit tests simpler. Here's a <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/data/test/scenarios/two_plus_two.cfg">minimal example</a>. </p><p>Generally speaking, a unit test is just a scenario with events which cause it to end in response to the <i>start</i> event, without interaction from the user. If you know how to make a Wesnoth scenario with events, and use the <code>[endlevel]</code> tag, you know everything you need to know. There are <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/data/test/macros/wml_unit_test_macros.cfg">a handful of macros</a> which can make it a little more succinct. </p><p>Test scenarios need to be registered in the test schedule file to be used by the continuous integration systems. The test schedule file also says what is supposed to be the result of the test -- is it supposed to pass? fail? timeout? result in a corrupted replay? The test schedule file is <a rel="nofollow" class="external text" href="https://github.com/wesnoth/wesnoth/blob/master/wml_test_schedule"><code>wml_test_schedule</code></a> at the root of the source tree. </p> <pre># # Sanity checks of the unit test system # 0 test_return 1 test_return_fail 0 test_assert 1 test_assert_fail 1 test_assert_fail_two 2 empty_test 4 break_replay_with_lua_random 0 fixed_lua_random_replay_with_sync_choice 0 test_end_turn ... </pre> <p>Make a line with your test scenario id. The line should begin with a number, this is the result code. </p><p>The schedule includes various kinds of expected failure to ensure that the system is working. Almost surely you want your own tests to pass, and should use code 0 for that. </p><p>Consult the UnitTestResult enum of the run_wml_tests script for the possible results of a WML unit test. </p><p>The <code>run_wml_tests</code> script also supports adding alternate test schedules and various other options, please consult its help text for more info: </p> <pre>./run_wml_tests -h </pre> <p>For more general info about WML unit tests please refer to this forum thread: <a rel="nofollow" class="external free" href="http://forums.wesnoth.org/viewtopic.php?t=40449">http://forums.wesnoth.org/viewtopic.php?t=40449</a> </p> <h2><span class="mw-headline" id="See_also">See also</span></h2> <ul><li><a href="/DeveloperGuide" title="DeveloperGuide">DeveloperGuide</a></li> <li><a href="/PatchSubmissionGuidelines" title="PatchSubmissionGuidelines">PatchSubmissionGuidelines</a></li></ul> <!-- NewPP limit report Cached time: 20241123144642 Cache expiry: 86400 Dynamic content: false CPU time usage: 0.006 seconds Real time usage: 0.006 seconds Preprocessor visited node count: 35/1000000 Preprocessor generated node count: 40/1000000 Post‐expand include size: 0/2097152 bytes Template argument size: 0/2097152 bytes Highest expansion depth: 2/40 Expensive parser function count: 0/100 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 0/5000000 bytes --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 0.000 1 -total --> </div> <!-- Saved in parser cache with key wiki-mw_:pcache:idhash:6202-0!canonical and timestamp 20241123144642 and revision id 71867 --> </div> <!-- end wikipage --> <div class="printfooter"> Retrieved from "<a dir="ltr" href="https://wiki.wesnoth.org/index.php?title=SoftwareTesting&oldid=71867">https://wiki.wesnoth.org/index.php?title=SoftwareTesting&oldid=71867</a>" </div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/Special:Categories" title="Special:Categories">Category</a>: <ul><li><a href="/Category:Development" title="Category:Development">Development</a></li></ul></div></div><div id="lastmod"> This page was last edited on 4 December 2023, at 04:50.</div> <div class="visualClear"></div> </div> <!-- bodyContent --> </div> <!-- end content --> </div> <!-- end main --> <div id="footer-sep"></div> <div id="footer"><div id="footer-content"><div> <a href="https://wiki.wesnoth.org/StartingPoints">Site Map</a> • <a href="https://status.wesnoth.org/">Site Status</a><br /> Copyright © 2003–2024 by <a rel="author" href="https://wiki.wesnoth.org/Project">The Battle for Wesnoth Project</a> — Powered by <a href="https://www.mediawiki.org/">MediaWiki</a><br /> Site design Copyright © 2017–2024 by Iris Morelle </div></div></div> <script>(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"0.006","walltime":"0.006","ppvisitednodes":{"value":35,"limit":1000000},"ppgeneratednodes":{"value":40,"limit":1000000},"postexpandincludesize":{"value":0,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":2,"limit":40},"expensivefunctioncount":{"value":0,"limit":100},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"timingprofile":["100.00% 0.000 1 -total"]},"cachereport":{"timestamp":"20241123144642","ttl":86400,"transientcontent":false}}});});</script><script>(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgBackendResponseTime":20});});</script></body></html>