This directory contains all of the C++ unit test cases for the DBMS.
The hierarchy in this directory should be a mirror of the src
structure.
If you add a utility class to the test directory, you must edit CMakeLists.txt
to include its .cpp file in the peloton-test-common
library.
-
A suite of unit tests for some particular feature or component of the system should be stored in a single source file. That file needs to end with the suffix
_test.cpp
in order to automatically get picked up as a unit test.Example:
string_util_test.cpp
. -
The name of a test suite class should end with the suffix
Tests
.Example:
StringFunctionsTests
. -
The name of each individual test case in a suite class be descriptive and explain what the test is checking. Avoid generic names like
BasicTest
. The name of the test needs to end with the suffixTest
.Example:
StringFunctionsTests::CharLengthTest
-
Any utility class that is specific to testing should be start with the prefix
Testing
. This is necessary to avoid confusion with the utility classes that are part of the main codebase.Example:
TestingSQLUtil
.
During testing of your functionality, you will most likely need to create a table and check your functionality against the tuples in the table in the testing code. Instead of creating a custom table for your test, make use of the functions in TestingExecutorUtil (/test/executor/testing_executor_util.cpp)
. A detailed explanation of how to use and create tables for your test by using the TestingExecutorUtil
is listed below.
-
CreateAndPopulateTable()
This is the most basic function call and in most cases will create the table you want test your functionality against. The function creates a table with 3 tile groups and 5 tuples in each tile group, thus the table has a total of 15 tuples. Each tuple has 4 columns (Column 1 and 2 are integer columns, Column 3 is decimal and Column 4 is VARCHAR). If the row number is
r
, then the tuple will be(r*10 , r*10 +1, r*10 +2, r*10 +3)
-
CreateTable()
andPopulateTable()
If
CreateAndPopulateTable()
does not satisfy your requirements you can make use of the following 2 calls:CreateTable()
: This lets you choose the tuples per tile group , whether you want indexes and the table id for referring to this table. The function returns astorage::Datatable *
. It has the same 4 columns as described above.PopulateTable()
: This takes in the table pointer, the current transaction pointer and populates the table for you. You have 4 parameters through which you can control how you want to populate this table.int num_rows
: You can choose the number of rows in the table using this functionbool mutate
: If this istrue
each tuple id of the form(r*30 , r*30 +1, r*30 +2, r*30 +3)
wherer
is the row number.bool random
: If thistrue
each tuple is of the form(r*10 , rand, rand, rand)
whererand
is a random number andr
is the row number.bool groupby
: If this istrue
only the first column has only 2 distinct values per tile group. Hence each tuple is of the form(int(r/(num_rows/2)), r*10 +1, r*10 +2, r*10 +3 )
wherer
is the row number andnum_rows
is the total number of rows.
If and only if you feel that none of the functions are able to create a table for your test, add the functionality to create that table in TestingExecutorUtil
instead of creating a table in your specific test. This will allow others also to reuse this table if they need to.
- 2017-02-02: Initial naming convention written by Andy
- 2017-11-07: Usage of TestingExecutorUtil to create tables written by Rohit