function addHelpers(oTable) {
		/**
		 * Gets the data cell element.
		 *
		 * @param {int} iRowIndex Index of the row. Can be negative, for example -1 for the last row.
		 * @param {int} iColumnIndex Index of the column. Can be negative, for example -1 for the last column.
		 * @returns {HTMLElement} The cell DOM element.
		 */
		oTable.qunit.getDataCell = function(iRowIndex, iColumnIndex) {
			iColumnIndex = iColumnIndex < 0 ? oTable.getColumns().length + iColumnIndex : iColumnIndex;
			iRowIndex = iRowIndex < 0 ? oTable.getRows().length + iRowIndex : iRowIndex;
			return oTable.getDomRef("rows-row" + iRowIndex + "-col" + iColumnIndex);
		};

		/**
		 * Gets the column header cell element.
		 *
		 * @param {int} iColumnIndex Index of the column in the list of visible columns. Can be negative, for example -1 for the last column.
		 * @param {int} [iRowIndex] Index of the header row.
		 * @returns {HTMLElement} The cell DOM element.
		 */
		oTable.qunit.getColumnHeaderCell = function(iColumnIndex, iRowIndex = 0) {
			iColumnIndex = iColumnIndex < 0 ? oTable._getVisibleColumns().length + iColumnIndex : iColumnIndex;
			return document.getElementById(oTable._getVisibleColumns()[iColumnIndex].getId() + (iRowIndex > 0 ? "_" + iRowIndex : ""));
		};

		/**
		 * Gets the row header cell element.
		 *
		 * @param {int} iRowIndex Index of the row the cell is inside. Can be negative, for example -1 for the last row.
		 * @returns {HTMLElement} The cell DOM element.
		 */
		oTable.qunit.getRowHeaderCell = function(iRowIndex) {
			iRowIndex = iRowIndex < 0 ? oTable.getRows().length + iRowIndex : iRowIndex;
			return oTable.getDomRef("rowsel" + iRowIndex);
		};

		/**
		 * Gets the row action cell element.
		 *
		 * @param {int} iRowIndex Index of the row the cell is inside. Can be negative, for example -1 for the last row.
		 * @returns {HTMLElement} Returns the DOM element.
		 */
		oTable.qunit.getRowActionCell = function(iRowIndex) {
			iRowIndex = iRowIndex < 0 ? oTable.getRows().length + iRowIndex : iRowIndex;
			return oTable.getDomRef("rowact" + iRowIndex);
		};

		/**
		 * Gets the selectAll cell element.
		 *
		 * @returns {HTMLElement} The cell DOM element.
		 */
		oTable.qunit.getSelectAllCell = function() {
			return oTable.getDomRef("selall");
		};

		/**
		 * Gets the row action header cell.
		 *
		 * @returns {HTMLElement} The cell DOM element.
		 */
		oTable.qunit.getRowActionHeaderCell = function() {
			return oTable.getDomRef("rowacthdr");
		};

		/**
		 * Adds a column that has test controls as template and label. Both template and label are text controls.
		 *
		 * @param {string|Object} [mConfig] A string that is set as the text of the template, or a config object. If no config is provided, the label
		 *                                  and template have empty texts.
		 * @param {string} [mConfig.id] Id for the new column.
		 * @param {string} [mConfig.text=undefined] The text of the template.
		 * @param {boolean} [mConfig.bind=false] Whether the text represents a binding path and the text property of the template should be bound.
		 *                                       The corresponding entry in the default test data is created if it does not yet exist.
		 * @param {boolean} [mConfig.focusable=false] Whether the text is focusable.
		 * @param {boolean} [mConfig.tabbable=false] Whether the text is tabbable.
		 * @param {string} [mConfig.label=undefined] The text of the label.
		 * @param {boolean} [mConfig.interactiveLabel=false] Whether the label should be interactive (focusable & tabbable).
		 * @returns {sap.ui.table.Column} The column that was added to the table.
		 * @see TableQUnitUtils.createTextColumn
		 */
		oTable.qunit.addTextColumn = function(mConfig) {
			const oColumn = TableQUnitUtils.createTextColumn(mConfig);
			oTable.addColumn(oColumn);
			return oColumn;
		};

		/**
		 * Adds a column that has interactive (focusable & tabbable) test controls as template and label. Both template and label are text controls.
		 *
		 * @param {string|Object} [mConfig] A string that is set as the text of the template, or a config object. If no config is provided, the label
		 *                                  and template have empty texts.
		 * @param {string} [mConfig.id] Id for the new column.
		 * @param {string} [mConfig.text=undefined] The text of the template.
		 * @param {boolean} [mConfig.bind=false] Whether the text represents a binding path and the text property of the template should be bound.
		 *                                       The corresponding entry in the default test data is created if it does not yet exist.
		 * @param {string} [mConfig.label=undefined] The text of the label.
		 * @returns {sap.ui.table.Column} The column that was added to the table.
		 * @see TableQUnitUtils.createInteractiveTextColumn
		 */
		oTable.qunit.addInteractiveTextColumn = function(mConfig) {
			const oColumn = TableQUnitUtils.createInteractiveTextColumn(mConfig);
			oTable.addColumn(oColumn);
			return oColumn;
		};

		/**
		 * Adds a column that has test controls as template and label. The template is an input control, and the label is a text control.
		 *
		 * @param {string|Object} [mConfig] A string that is set as the text of the template, or a config object. If no config is provided, the label
		 *                                  and template have empty texts.
		 * @param {string} [mConfig.id] Id for the new column.
		 * @param {string} [mConfig.text=undefined] The text of the template.
		 * @param {boolean} [mConfig.bind=false] Whether the text represents a binding path and the text property of the template should be bound.
		 *                                       The corresponding entry in the default test data is created if it does not yet exist.
		 * @param {string} [mConfig.type=text] The type of the input element.
		 * @param {boolean} [mConfig.tabbable=false] Whether the input is tabbable.
		 * @param {string} [mConfig.label=undefined] The text of the label.
		 * @param {boolean} [mConfig.interactiveLabel=false] Whether the label should be interactive (focusable & tabbable).
		 * @returns {sap.ui.table.Column} The column that was added to the table.
		 * @see TableQUnitUtils.createInputColumn
		 */
		oTable.qunit.addInputColumn = function(mConfig) {
			const oColumn = TableQUnitUtils.createInputColumn(mConfig);
			oTable.addColumn(oColumn);
			return oColumn;
		};

		/**
		 * A "touchstart" event is translated to a "mousedown" event by UI5. When the "mousedown" event is forwarded to the item navigation, it
		 * focuses the target element. When an element is focused, the browser scrolls it into the view. This method prevents this chain of events
		 * and is therefore useful when testing scrolling with touch events.
		 */
		oTable.qunit.preventFocusOnTouch = function() {
			oTable._getKeyboardExtension().suspendItemNavigation();
		};

		/**
		 * Sets the row states and invalidates the table. The row states are applied in the order in which they are provided. The row states are
		 * reset if no row states are provided.
		 *
		 * @param {object[]} [aRowStates] The row states to set.
		 * @returns {Promise} A promise that resolves after the rendering of the table is finished.
		 */
		oTable.qunit.setRowStates = function(aRowStates) {
			if (aRowStates) {
				if (!oTable.qunit._mSetRowStates) {
					oTable.qunit._mSetRowStates = {
						updateRowState: function(oState) {
							const iIndex = oTable.getFirstVisibleRow() + oTable.qunit._mSetRowStates.currentIndex;
							Object.assign(oState, oTable.qunit._mSetRowStates.rowStates[iIndex]);
							oTable.qunit._mSetRowStates.currentIndex++;
						},
						resetCounter: function() {
							oTable.qunit._mSetRowStates.currentIndex = 0;
						},
						onBeforeRendering: function() {
							this.resetCounter();
						},
						currentIndex: 0
					};
					oTable.attachRowsUpdated(oTable.qunit._mSetRowStates.resetCounter);
					oTable.addDelegate(oTable.qunit._mSetRowStates, true, oTable.qunit._mSetRowStates);
					TableUtils.Hook.register(oTable, TableUtils.Hook.Keys.Row.UpdateState, oTable.qunit._mSetRowStates.updateRowState);
				}
				oTable.qunit._mSetRowStates.rowStates = aRowStates;
			} else if (oTable.qunit._mSetRowStates) {
				oTable.detachRowsUpdated(oTable.qunit._mSetRowStates.resetCounter);
				oTable.removeEventDelegate(oTable.qunit._mSetRowStates);
				TableUtils.Hook.deregister(oTable, TableUtils.Hook.Keys.Row.UpdateState, oTable.qunit._mSetRowStates.updateRowState);
				delete oTable.qunit._mSetRowStates;
			}

			oTable.invalidate();
			return oTable.qunit.whenRenderingFinished();
		};
	}
Resets to the original content density and invalidates the table.

@returns {Promise} A promise that resolves after the rendering of the table is finished.