{"id":9189,"date":"2019-07-06T19:23:15","date_gmt":"2019-07-06T17:23:15","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=9189"},"modified":"2023-11-08T10:37:37","modified_gmt":"2023-11-08T09:37:37","slug":"running-utplsql-tests-in-sql-developer","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/","title":{"rendered":"Running utPLSQL Tests in SQL Developer"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In November 2017 Jacek Gebal asked me if I could help to integrate utPLSQL into SQL Developer. In January 2018 we released the first MVP. Tests were executed in a new SQL Developer worksheet showing the result in the script output pane. This was easy to implement and it simplified the use of utPLSQL. But there are some downsides to that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test results become visible after the completion of all tests. This is inconvenient for larger test suites, even if the tests run in an unshared worksheet.<\/li>\n\n\n\n<li>When a test fails, the developer has to navigate manually to the failing source code line (no hyperlinks).<\/li>\n\n\n\n<li>Results are monochrome, there is no green or red text, to highlight the test result like in the utPLSQL-cli.<\/li>\n\n\n\n<li>Overall it looks and feels awkward and it is not so much fun to work with.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">While we introduced a couple of new features such as test templates, test generation or code coverage; we never addressed these primary flaws. Surely you have heard the motto &#8220;keep the bar green to keep the code clean&#8221;. It refers to the JUnit test runner IDE component that displays a progress bar which remains green as long as all tests are passed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m proud to announce that <a href=\"https:\/\/github.com\/utPLSQL\/utPLSQL-SQLDeveloper\">utPLSQL for SQL Developer<\/a> introduced in version 1.0.0 such a component. Download the latest version from <a href=\"https:\/\/github.com\/utPLSQL\/utPLSQL-SQLDeveloper\/releases\">Github<\/a>. At the end of this blog post, you find an audio-less video, showing the <a href=\"#realtime_reporter\">realtime reporter (utPLSQL test runner) in Action<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Content<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this blog post, I show how the utPLSQL test runner works and explain some design decisions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We had quite extensive threads in our private utPLSQL Slack design channel about various topics. And it became evident that as soon as we talked about the UI, the number of opinions was quite consistent with the number of people involved. So this blog post should help me (and hopefully others as well) to simplify some future discussions around this topic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Running utPLSQL Tests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are currently three options to run utPLSQL tests without installing additional extensions (besides utPSQL for SQL Developer).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Manual<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open a worksheet and type all the necessary commands yourself<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual.png\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"142\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual.png\" alt=\"Manually craft a run\" class=\"wp-image-9195\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual.png 772w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual-300x55.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual-768x142.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual-260x48.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual-50x9.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_manual-150x28.png 150w\" sizes=\"auto, (max-width:767px) 480px, (max-width:772px) 100vw, 772px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2. From Connections Window<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Select one or more nodes (user, schemas, package specifications, package bodies or package procedures), right-click and select <code>Run utPLSQL test<\/code> from the context menu.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections.png\"><img loading=\"lazy\" decoding=\"async\" width=\"486\" height=\"230\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections.png\" alt=\"Run from connections window\" class=\"wp-image-9197\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections.png 486w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections-300x142.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections-260x123.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections-50x24.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_from_connections-150x71.png 150w\" sizes=\"auto, (max-width:767px) 480px, 486px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3. From Editor (PL\/SQL or Worksheet)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Right-click and select <code>Run utPLSQL test<\/code> from the context menu in the editor containing a test package or test package body (or both). The cursor position determines the test or suite to be executed. In the following example it&#8217;s the package procedure <code>test_linage_util.test_target_cols_from_insert<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor.png\"><img loading=\"lazy\" decoding=\"async\" width=\"690\" height=\"283\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor.png\" alt=\"Run from editor\" class=\"wp-image-9200\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor.png 690w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor-300x123.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor-260x107.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor-50x21.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_editor-150x62.png 150w\" sizes=\"auto, (max-width:767px) 480px, 690px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Realtime Reporter (utPLSQL Test Runner)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">utPLSQL supports an unbounded number of reporters, that can be attached to a test run. For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ut_documentation_reporter<\/code> for human-readable output on a console<\/li>\n\n\n\n<li><code>ut_junit_reporter<\/code> for CI environments like Jenkins or Bamboo<\/li>\n\n\n\n<li><code>ut_coverage_html_reporter<\/code> for code coverage report in HTML format<\/li>\n\n\n\n<li><code>ut_realtime_reporter<\/code>&nbsp; for IDEs such as SQL Developer or TOAD<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">We call the utPLSQL test runner window in SQL Developer also &#8220;realtime reporter&#8221;, since it shows the results of a test run in near-realtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The realtime reporter uses for every run two fresh connections to the database. One to run the tests (producer) and the other to read the results continuously (consumer). For a good user experience, it is important that you save the password of the connections used for utPLSQL within SQL Developer. Otherwise, you will be prompted for the password. In fact twice. For the producer and the consumer session.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Default Layout<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, you find the dockable window next to the Connections window. At this position, we want a narrow window, so that there is enough space on the right side for editors. You can move this window to any position you like and change its size. SQL Developer saves the settings on exit. The following screenshot shows the realtime reporter with default settings.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default.png\"><img loading=\"lazy\" decoding=\"async\" width=\"429\" height=\"669\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default.png\" alt=\"Default layout of the realtime reporter\" class=\"wp-image-9194\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default.png 429w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default-192x300.png 192w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default-94x146.png 94w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default-32x50.png 32w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utlsql_default-48x75.png 48w\" sizes=\"auto, (max-width:767px) 429px, 429px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Components<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We use Java Swing components. It&#8217;s possible to use others, but SQL Developer uses mostly Swing components as well. Hence, we decided to go this way as long as there is no pressing reason to change that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The visualization of Swing components depends heavily on the chosen Look &amp; Feel (e.g. on Windows the progress bar is segmented). The default Look &amp; Feel for SQL Developer is on all platforms &#8220;Oracle&#8221;. On Windows you may change it to &#8220;Windows&#8221;, on macOS to &#8220;Mac OS X&#8221; and on Ubuntu to &#8220;Metal&#8221;. In this blog post, I use the Oracle Look &amp; Feel. It works best on all platforms.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Window Title<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The representation of the window title depends on the window position. Within a tabbed pane on the leftmost docking area, it looks like this (in this area we would like to present titles as compactly as possible, hence small font and no icon) :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_left.png\"><img loading=\"lazy\" decoding=\"async\" width=\"76\" height=\"30\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_left.png\" alt=\"Title (left docked area)\" class=\"wp-image-9201\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_left.png 76w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_left-50x20.png 50w\" sizes=\"auto, (max-width:767px) 76px, 76px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In all other docking areas, an icon appears left to the text and the text font is bigger. It looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_other.png\"><img loading=\"lazy\" decoding=\"async\" width=\"106\" height=\"30\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_other.png\" alt=\"Title (non-left docked area)\" class=\"wp-image-9202\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_other.png 106w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_title_other-50x14.png 50w\" sizes=\"auto, (max-width:767px) 106px, 106px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Within the SQL Developer framework (which is based on JDeveloper) certain standards in place are responsible for the final representation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Toolbar<\/h4>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar.png\"><img loading=\"lazy\" decoding=\"async\" width=\"428\" height=\"35\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar.png\" alt=\"Toolbar\" class=\"wp-image-9204\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar.png 428w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar-300x25.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar-260x21.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar-50x4.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_toolbar-150x12.png 150w\" sizes=\"auto, (max-width:767px) 428px, 428px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The components on the toolbar from left to right have the following meaning:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/refresh.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9251\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/refresh.png\" alt=\"refresh\" width=\"16\" height=\"16\"\/><\/a> Reset ordering and refresh: Restores default sort order and deselects all tests.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/run.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" class=\"alignnone size-full wp-image-9252\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/run.png\" alt=\"run\"\/><\/a> Rerun all tests: Reruns all tests shown in the current realtime reporter, the selected tests are not changing the behaviour, because it would be cumbersome to rerun all tests.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/run_worksheet.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9253\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/run_worksheet.png\" alt=\"run in worksheet\" width=\"16\" height=\"16\"\/><\/a> Rerun all tests in new worksheet: The same logic as the previous button, but runs the tests in a new worksheet.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/combobox.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" class=\"alignnone size-full wp-image-9255\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/combobox.png\" alt=\"combobox\"\/><\/a> Run history: The identifier of a run is the start time and the connection name in parenthesis. The last ten runs are kept by default. Select another run anytime. The UI should never be blocked.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/clear.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9254\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/clear.png\" alt=\"clear\" width=\"16\" height=\"16\"\/><\/a> Clear run history: Clears all history entries, except the currently selected run.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Important: the scope of the rerun buttons in the toolbar is the complete run. Always.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Run Status<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The next screenshot shows the final status of a test run.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status.png\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"109\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status.png\" alt=\"Run status\" class=\"wp-image-9224\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status.png 416w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status-300x79.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status-260x68.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status-50x13.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status-150x39.png 150w\" sizes=\"auto, (max-width:767px) 416px, 416px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">At the top, we see a textual status and at the bottom, the progress bar indicates success via a green and failure or error via a red bar. The textual status either ends on <code>...<\/code> or <code>.<\/code> as an additional indicator for the completeness of a test run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the middle are some counters. All counters have an associated icon, except the first one,&nbsp; <code>Tests<\/code>, to reserve space for larger numbers (e.g. <code>4242\/4242<\/code>). All counters have the same width to represent them as columns, e.g when including additional counters like here:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"421\" height=\"131\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2.png\" alt=\"Run status with optional counters\" class=\"wp-image-9231\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2.png 421w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2-300x93.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2-260x81.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2-50x16.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_2-150x47.png 150w\" sizes=\"auto, (max-width:767px) 421px, 421px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can enable\/disable these additional counters via context menu or in the utPLSQL preferences.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"413\" height=\"130\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3.png\" alt=\"Run status with context menu\" class=\"wp-image-9232\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3.png 413w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3-300x94.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3-260x82.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3-50x16.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_run_status_3-150x47.png 150w\" sizes=\"auto, (max-width:767px) 413px, 413px\" \/><\/a><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Test States<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">A test has one of the following final states:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9233\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\" alt=\"success\" width=\"16\" height=\"16\"\/><\/a> success: the expected value matches the actual value<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9234\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\" alt=\"failure\" width=\"16\" height=\"16\"\/><\/a> failure: the expected value does not match the actual value<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9235\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\" alt=\"error\" width=\"16\" height=\"16\"\/><\/a> error: there was an error during the test execution<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9236\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\" alt=\"disabled\" width=\"16\" height=\"16\"\/><\/a> disabled: the test is not enabled and therefore not executed<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The sum of these counters matches the total number of tests.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Warnings and Informational Messages<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Additionally, every test may have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/warning.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9237\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/warning.png\" alt=\"warning\" width=\"16\" height=\"16\"\/><\/a> warnings:\n<ul class=\"wp-block-list\">\n<li>These are messages by the utPLSQL framework.<\/li>\n\n\n\n<li>You should get rid of these warnings, even if they do not affect the correct outcome of your tests.<\/li>\n\n\n\n<li>You may do that by amending your test code or your program under test.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/info.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9238\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/info.png\" alt=\"info\" width=\"16\" height=\"16\"\/><\/a> info:\n<ul class=\"wp-block-list\">\n<li>These are <code>DBMS_OUTPUT<\/code> messages by the program under test or by the test code.<\/li>\n\n\n\n<li>The utPLSQL framework does not produce such messages.<\/li>\n\n\n\n<li>They do not affect the correct outcome of a test.<\/li>\n\n\n\n<li>Why is this called <code>info<\/code> and not <code>DBMS_OUTPUT<\/code> or <code>server output<\/code> or simply <code>output<\/code>? Well, there are some practical reasons. <code>info<\/code> is short and has a nice, known icon. Besides that, we name here the <strong>content\/severity<\/strong> (informational message, that does not affect the outcome of a test) and not the <strong>transportation mechanism<\/strong> (<code>DBMS_OUTPUT<\/code>). As a result, this is concise with <code>failure<\/code>, <code>error<\/code>\u00a0 and\u00a0 <code>warning<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Test Overview<\/h4>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview.png\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"121\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview.png\" alt=\"Test overview\" class=\"wp-image-9247\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview.png 395w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview-300x92.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview-260x80.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview-50x15.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview-150x46.png 150w\" sizes=\"auto, (max-width:767px) 395px, 395px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">By default, this tabular representation of all tests has the following three columns:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/status.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9248\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/status.png\" alt=\"test status\" width=\"16\" height=\"16\"\/><\/a> Test status:\n<ul class=\"wp-block-list\">\n<li>Contains one of the following four test states:\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9233\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\" alt=\"success\" width=\"16\" height=\"16\"\/><\/a> success<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9234\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\" alt=\"failure\" width=\"16\" height=\"16\"\/><\/a> failure<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9235\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\" alt=\"error\" width=\"16\" height=\"16\"\/><\/a> error<\/li>\n\n\n\n<li><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9236\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\" alt=\"disabled\" width=\"16\" height=\"16\"\/><\/a> disabled<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>You may sort by this column, even if it contains icons only.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Suitepath\/Description\n<ul class=\"wp-block-list\">\n<li>By default, this column shows the suitepath of a test.<\/li>\n\n\n\n<li>A suitepath can be very lengthy.<\/li>\n\n\n\n<li>To get a narrow representation, the header of the column is set to the common prefix of all tests. In this case it&#8217;s <code>plscope.test.test_lineage_util.test_<\/code>.<\/li>\n\n\n\n<li>Via context menu, you can enable the description of a test instead of the suitepath. However, if a description is missing, the suitepath is shown nonetheless.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Time [s]\n<ul class=\"wp-block-list\">\n<li>Execution time in seconds of the test<\/li>\n\n\n\n<li>Please note that the sum of all tests does not match the run time in the run status, because initialization times and times spent on suite level are not reported here.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You may sort the overview table by clicking on a column. The first click sorts them ascending, the second click descending. To restore the original order, press <a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/refresh.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9251\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/refresh.png\" alt=\"refresh\" width=\"16\" height=\"16\"\/><\/a> in the toolbar. Ascending sort order for test status means: <a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9233\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/success.png\" alt=\"success\" width=\"16\" height=\"16\"\/><\/a>, <a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9234\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/failure.png\" alt=\"failure\" width=\"16\" height=\"16\"\/>, <\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9235\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/error.png\" alt=\"error\" width=\"16\" height=\"16\"\/>,&nbsp;<\/a><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9236\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/disabled.png\" alt=\"disabled\" width=\"16\" height=\"16\"\/>.<\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Warnings and Informational Messages<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">You can enable\/disable these additional indicators via the context menu or in the utPLSQL preferences.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"182\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2.png\" alt=\"Run overview context menu\" class=\"wp-image-9257\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2.png 395w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2-300x138.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2-260x120.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2-50x23.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_2-150x69.png 150w\" sizes=\"auto, (max-width:767px) 395px, 395px\" \/><\/a><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Rerun Selected Tests<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">You can select one or more tests and rerun them. Either in realtime reporter or in a new worksheet.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"223\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3.png\" alt=\"Rerun selected tests\" class=\"wp-image-9259\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3.png 642w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3-300x104.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3-260x90.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3-50x17.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_3-150x52.png 150w\" sizes=\"auto, (max-width:767px) 480px, 642px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><br \/><a name=\"table_or_tree\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Table or Tree?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">utPLSQL test suites are hierarchies. A tree view would be a natural choice, right? Well, yes for the hierarchical representation, this is correct. We already use that in the oddgen integration. Sorting is a simple way to group tests, and find failed or slow tests. However, sorting is not easy in a tree. Even a combined tree\/table structure does not help sort the complete result set. And there are other issues. Filtering tests and presenting a well-arranged result, for instance. Because of these limitations, we decided to go with a simple table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That said, I think, that we should provide rather sooner than later an alternative hierarchical view to give the test descriptions (representing features\/requirements) a better context. The suite descriptions are currently lost and this is really sad for projects that have good suite and test descriptions.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Test Results on Suite Level<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">But what happens with results on the suite level? &#8211; We ignore them. With two exceptions. Warnings and informational messages on the suite level are included in the last test of the suite. Here&#8217;s an example of warnings:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"432\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4.png\" alt=\"Warnings on suite level\" class=\"wp-image-9262\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4.png 406w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4-282x300.png 282w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4-137x146.png 137w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4-47x50.png 47w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_test_overview_4-70x75.png 70w\" sizes=\"auto, (max-width:767px) 406px, 406px\" \/><\/a><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Open PL\/SQL Editor<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Double-click on a test in the test overview table to open the PL\/SQL package specification at the line of the associated test procedure.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Synchronize Detail Tab Based on Test Status<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">By default, the most relevant detail tab of a test is opened automatically. As a result, you do not need to browse through all detail tabs. Behind the scenes, we use this rule set:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>open <code>Failures<\/code> if number of failures &gt; 0<\/li>\n\n\n\n<li>open <code>Errors<\/code> if errors is not empty<\/li>\n\n\n\n<li>open <code>Warnings<\/code> if warnings is not empty<\/li>\n\n\n\n<li>open <code>Info<\/code> if info is not empty<\/li>\n\n\n\n<li>open <code>Test<\/code> in all other cases<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can enable\/disable this synchronization via the context menu or in the utPLSQL preferences.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Test Details<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">There are 5 tabs with detailed information for a test in the test overview.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">1. Test<\/h5>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test.png\"><img loading=\"lazy\" decoding=\"async\" width=\"401\" height=\"369\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test.png\" alt=\"\" class=\"wp-image-9277\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test.png 401w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test-300x276.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test-159x146.png 159w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test-50x46.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_test-82x75.png 82w\" sizes=\"auto, (max-width:767px) 401px, 401px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the best case, successful and disabled tests provide further details in this tab only.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The description is empty in this example. However, the utPLSQL team recommends to use of descriptions. I remember when Jacek Gebal gave me once the following feedback regarding my tests for the <a href=\"https:\/\/github.com\/utPLSQL\/utPLSQL\/commit\/42cf8ee11f120ccbce2dadce7b864943d209df37#diff-ff324befe7d93f88d09e2b82ef873d2a\">ut_realtime_reporter<\/a>:<\/p>\n\n\n<div class=\"blockquote\"><span class=\"mfn-blockquote-icon\"><i class=\"icon-quote\" aria-hidden=\"true\"><\/i><\/span><blockquote class=\"mfn-inline-editor\">Rather than describing what the test is checking: <code>--%test(Check XML report structure)<\/code>, describe the tested code functionality:\u00a0<code>--%test(Builds appropriate XML report structure)<\/code>. That way, when executing the tests, we see a list of descriptions for functionalities (requirements) that are working.<\/blockquote><p class=\"author\"><i class=\"icon-user\"><\/i><a href=\"https:\/\/twitter.com\/GebalJacek\" target=\"_blank\" title=\"\" aria-label=\"author\">Jacek Gebal<\/a><\/p><\/div>\n\n\n\n\n<p class=\"wp-block-paragraph\">Good advice. Sounds easier than it is, especially when you want to keep the descriptions short and concise. However, I&#8217;m working on it.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2. Failures<\/h5>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures.png\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"307\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures.png\" alt=\"\" class=\"wp-image-9287\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures.png 487w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures-300x189.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures-232x146.png 232w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures-50x32.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_failures-119x75.png 119w\" sizes=\"auto, (max-width:767px) 480px, 487px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A test may have an unbounded number of asserts. Each failed assert is listed in the failures table. And for each failed assert, you find a detailed failure message. You can either double-click on the row in the failed assert table or click on the hyperlink to open the PL\/SQL editor at the line of the failed assert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I really like that utPLSQL provides a complete list of all failed assertions and does not stop after the first one like JUnit.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3. Errors<\/h5>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors.png\"><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"245\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors.png\" alt=\"Errors\" class=\"wp-image-9281\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors.png 405w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors-300x181.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors-241x146.png 241w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors-50x30.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_errors-124x75.png 124w\" sizes=\"auto, (max-width:767px) 405px, 405px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Errors that occur during the execution of a test are reported here. However, if an error occurs on the test suite level, for example in a procedure annotated with <code>%afterall<\/code>, then these errors are considered warnings by the utPLSQL framework and are reported in the warnings tab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click on a hyperlink to open the associated source code line in the PL\/SQL editor.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">4. Warnings<\/h5>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings.png\"><img loading=\"lazy\" decoding=\"async\" width=\"485\" height=\"420\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings.png\" alt=\"Warnings\" class=\"wp-image-9291\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings.png 485w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings-300x260.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings-169x146.png 169w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings-50x43.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_warnings-87x75.png 87w\" sizes=\"auto, (max-width:767px) 480px, 485px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When you read the warnings casually then you might get the impression that the rollback warning is reported twice. However, the first warning was for the rollback after test. The second warning was for the rollback after test suite. The last test of a suite also contains the warnings at the suite level. For example, the warning about the incomplete &#8211;%tags would have been lost, if only warnings at the test level had been reported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click on a hyperlink to open the associated source code line in the PL\/SQL editor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I recommend using utPLSQL v3.1.8 or later (which will be released soon). Starting with this version, utPLSQL answers the following question regarding the link to the source code: Do I have to open the package specification or the package body? In this case (<code>at package \"PLSCOPE.TEST_LINAGE_UTIL\", 20<\/code>) it&#8217;s clear. But without the <code>package<\/code> token, utPLSQL for SQL Developer assumes that the package body is meant.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important: Warning messages have been introduced in the <code>ut_realtime_reporter<\/code> of utPLSQL v3.1.7. Therefore warning messages are empty if you use v3.1.4, v3.1.5 or v3.1.6.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BTW, I see no reason to work with an old version of utPLSQL, besides the fear of new bugs. utPLSQL is basically stateless, which means there is no data to be migrated. Hence, a complete reinstall is always feasible and the annotation cache will be recalculated automatically. If you really stumble over a critical bug, then fix it by installing the previous version. It is simple enough. And don&#8217;t forget to <a href=\"https:\/\/github.com\/utPLSQL\/utPLSQL\/issues\/new?assignees=&amp;labels=&amp;template=bug_report.md&amp;title=\">let us know<\/a>. Thanks in advance. ;-)<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">5. Info<\/h5>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info.png\"><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"196\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info.png\" alt=\"Info\" class=\"wp-image-9283\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info.png 405w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info-300x145.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info-260x126.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info-50x24.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/running_utplsql_detail_info-150x73.png 150w\" sizes=\"auto, (max-width:767px) 405px, 405px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The utPLSQL framework captures all <code>DBMS_OUTPUT<\/code> messages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If these messages contain source code references, then these references are converted to hyperlinks as shown in the tabs <code>Failures<\/code>, <code>Errors<\/code> and <code>Warnings<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"realtime_reporter\"><\/a>Realtime Reporter in Action<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this 2.5 minute audio-less video (in original speed) I run a test suite using <a href=\"https:\/\/github.com\/utPLSQL\/utPLSQL-SQLDeveloper\/releases\/tag\/v1.0.0\">utPLSQL for SQL Developer v1.0.0<\/a>. And I fix 1 error, 1 failure,\u00a0 1 warning,\u00a0 2 informational messages and re-enable a disabled test.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/07\/utplsql_runner.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In November 2017 Jacek Gebal asked me if I could help to integrate utPLSQL into SQL Developer. In January 2018 we released the first MVP. Tests were executed in a new SQL Developer worksheet showing the result in the script output pane. This was easy to implement and it simplified the<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":9480,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[13,87,105],"class_list":["post-9189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-plsql","tag-sql-developer","tag-utplsql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-07-06T17:23:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T09:37:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"750\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Running utPLSQL Tests in SQL Developer\",\"datePublished\":\"2019-07-06T17:23:15+00:00\",\"dateModified\":\"2023-11-08T09:37:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/\"},\"wordCount\":2415,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/utplsql.png\",\"keywords\":[\"PL\\\/SQL\",\"SQL Developer\",\"utPLSQL\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/\",\"name\":\"Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/utplsql.png\",\"datePublished\":\"2019-07-06T17:23:15+00:00\",\"dateModified\":\"2023-11-08T09:37:37+00:00\",\"description\":\"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/utplsql.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/utplsql.png\",\"width\":1200,\"height\":750},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/07\\\/06\\\/running-utplsql-tests-in-sql-developer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running utPLSQL Tests in SQL Developer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog","description":"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/","og_locale":"en_US","og_type":"article","og_title":"Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog","og_description":"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.","og_url":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2019-07-06T17:23:15+00:00","article_modified_time":"2023-11-08T09:37:37+00:00","og_image":[{"width":1200,"height":750,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Running utPLSQL Tests in SQL Developer","datePublished":"2019-07-06T17:23:15+00:00","dateModified":"2023-11-08T09:37:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/"},"wordCount":2415,"commentCount":2,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png","keywords":["PL\/SQL","SQL Developer","utPLSQL"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/","url":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/","name":"Running utPLSQL Tests in SQL Developer - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png","datePublished":"2019-07-06T17:23:15+00:00","dateModified":"2023-11-08T09:37:37+00:00","description":"In this blog post I show how the utPLSQL test runner works and explain some design decisions. And the audioless video helps to understand how it works.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/12\/utplsql.png","width":1200,"height":750},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2019\/07\/06\/running-utplsql-tests-in-sql-developer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Running utPLSQL Tests in SQL Developer"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=9189"}],"version-history":[{"count":80,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9189\/revisions"}],"predecessor-version":[{"id":12658,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9189\/revisions\/12658"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/9480"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=9189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=9189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=9189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}