testsuite.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. %
  2. % How to write a testsuite for ns.
  3. % Drafted by Xuan Chen (xuanc@usc.edu) 
  4. % Fri Nov 10 11:14:57 PST 2000
  5. %
  6. chapter{Test Suite Support}
  7. label{chap:testsuite}
  8. The ns distribution contains many test suites under nsf{tcl/test}, which
  9. used by validation programs (nsf{validate, validate-wired, validate-wireless, 
  10. and validate.win32}) to verify that the installation of ns is correct. If you 
  11. modify or add new modules to ns, you are encouraged to run the validation 
  12. programs to make sure that your changes do not affect other parts in ns. 
  13. section{Test Suite Components}
  14. label{sec:testsuitecomponents}
  15. Each test suite under nsf{tcl/test} is written to verify the correctness
  16. of a certain module in ns. It has 3 components: 
  17. begin{itemize}
  18. item A shell script (test-all-xxx) to start the test;
  19. item A ns tcl script (test-suite-xxx.tcl) to actually run through the tests 
  20.    defined.
  21. item A subdirectory (test-output-xxx) under nsf{tcl/test}, which contains 
  22.  thecorrect trace files generated by the test suite. These files are used to 
  23.  verify if the test suite runs correctly with your ns.
  24. end{itemize}
  25. (Note: xxx stands for the name of the test suite.)
  26. section{Write a Test Suite}
  27. label{sec:writeatestsuite}
  28. You can take one of the test suites under nsf{tcl/test} as a template when
  29. you are writing your own, for example the test suite written for wireless lan
  30. (test-all-wireless-lan, test-suite-wireless-lan.tcl, and 
  31. test-output-wireless-lan). 
  32. To write a test suite, you first need to write the shell script (test-all-xxx).
  33. In the shell script, you specify the module to be tested, the name of the ns 
  34. tcl script and the output subdirectory. You can run this shell script in quiet 
  35. mode. Below is the example (test-all-wireless-lan):
  36. begin{program}
  37.    # To run in quiet mode:  "./test-all-wireless-lan quiet".
  38.    f="wireless-lan" # Specify the name of the module to test.
  39.    file="test-suite-$f.tcl" # The name of the ns script.
  40.    directory="test-output-$f"  # Subdirectory to hold the test results
  41.    version="v2" # Speficy the ns version.
  42.    
  43.    # Pass the arguments to test-all-template1, which will run through
  44.    # all the test cases defined in test-suite-wireless-lan.tcl.
  45.    ./test-all-template1 $file $directory $version $@
  46. end{program}
  47. You also need to create several test cases in the ns script (test-suite-xxx.tcl)
  48. by defining a subclass of TestSuite for each different test. For example, in 
  49. test-suite-wireless-lan.tcl, each test case uses a different Ad Hoc routing 
  50. protocol. They are defined as:
  51. begin{program}
  52.    Class TestSuite
  53.    # wireless model using destination sequence distance vector
  54.    Class Test/dsdv -superclass TestSuite
  55.    # wireless model using dynamic source routing
  56.    Class Test/dsr -superclass TestSuite
  57.    ... ...
  58. end{program}
  59. Each test case is basically a simulation scenario. In the super class 
  60. TestSuite, you can define some functions, like init and finish to do the work 
  61. required by each test case, for example setting up the network topology and ns
  62. trace. The test specific configurations are defined within the corresponding 
  63. sub-class. Each sub-class also has a run function to start the simulation.
  64. begin{program}
  65.    TestSuite instproc init {} {
  66.      global opt tracefd topo chan prop 
  67.      global node_ god_ 
  68.      $self instvar ns_ testName_
  69.      set ns_         [new Simulator]
  70.       ... ...
  71.    } 
  72.    TestSuite instproc finish {} {
  73.      $self instvar ns_
  74.      global quiet
  75.      $ns_ flush-trace
  76.      puts "finishing.."
  77.      exit 0
  78.    }
  79.         
  80.    Test/dsdv instproc init {} {
  81.      global opt node_ god_
  82.      $self instvar ns_ testName_
  83.      set testName_       dsdv
  84.      ... ...    
  85.      $self next
  86.      ... ...
  87.      $ns_ at $opt(stop).1 "$self finish"
  88.    }
  89.    Test/dsdv instproc run {} {
  90.      $self instvar ns_
  91.      puts "Starting Simulation..."
  92.      $ns_ run
  93.    }
  94. end{program}
  95. All the tests are started by the function runtest in the ns script.
  96. begin{program}
  97.    proc runtest {arg} {
  98.      global quiet
  99.      set quiet 0
  100.      set b [llength $arg]
  101.      if {$b == 1} {
  102.         set test $arg
  103.      } elseif {$b == 2} {
  104.         set test [lindex $arg 0]
  105.         if {[lindex $arg 1] == "QUIET"} {
  106.          set quiet 1
  107.         }
  108.       } else {
  109.          usage
  110.      }
  111.      set t [new Test/$test]
  112.      $t run
  113. }
  114. global argv arg0
  115. runtest $argv
  116. end{program}
  117. When you run the tests, trace files are generated and saved to the output 
  118. subdirectory. These trace files are compared to the those correct trace coming 
  119. with the test suite. If the comparation shows difference, the test is failed.