[{"data":1,"prerenderedAt":48},["ShallowReactive",2],{"apiTokenPageSlug":3,"blog-page-principles-of-writing-automated-tests":5,"apiTokenSlugHero":13,"apiTokenSlug":14,"blogBySlugHero":15,"blog-principles-of-writing-automated-tests":17,"recentBlogsSlug":19},{"APIToken":4},"haiokkwjyqedmiuybofpiepcxfoyqdyzfthuqbcywvqhmmpuembegnbwrlkvkmbm",[6],{"BlogDetails":7,"BlogID":8,"BlogSlug":9,"BlogTitle":10,"created_at":11,"mediaURL":12},"\u003Cp>I've discovered that there aren't enough static analyzers and code formatters for developing effective tests from my work on test automation in several projects. The team had to come to a consensus on how the exams should be written.\u003C/p>\u003Cp>It will be chaos if each team member writes tests according to his or her ideal vision. Some patterns for Java or Python unit tests do not work for JavaScript integration tests, and vice versa. A particular type of test should be consistent and adhere to the project's approved rules.\u003C/p>\u003Cp>The concepts that are listed here are founded on years of expertise and have been successfully applied to actual projects. They are most appropriate for JavaScript/TypeScript end-to-end tests (API and UI) on relevant test frameworks such as mocha, Jest, Webdriver IO, Playwright, and others. Common sense will decide whether certain principles overlap, clash, or are even problematic; it all depends on the circumstances of the testing project.\u003C/p>\u003Ch3>No tests without assertions\u003C/h3>\u003Cp>We all know that&nbsp;\u003Cstrong>tests without assertions aren’t testing much\u003C/strong>. After all, they may pass even if the behavior isn’t as expected. The question then is: If we all know tests should have assertions, why do we see tests without them?\u003C/p>\u003Cp>Maybe the simplest reason is that the developer wanted the test to break in case the production code threw an exception. Sure, this works. If no exceptions are thrown, the test will pass. If an exception happens, JUnit will make sure to fail the test.\u003C/p>\u003Cp>In such cases, I always ask myself: \"Isn’t there something to be asserted in case the behavior is as expected?\" Think of some batch job that summarizes the billing of customers with a due date of today. Can’t the test assert that the invoices were generated correctly?\u003C/p>\u003Cp>Tests that just expect the production code not to break are often weak. We want the opposite: tests with strong assertions that would capture any slight deviation from the expected behavior.\u003C/p>\u003Cp>Now, I fear the&nbsp;\u003Cstrong>most common reason for tests without assertions is \u003C/strong>a \u003Cstrong>lack of observability\u003C/strong>. It is so hard to observe the output of the program under test, that developers simply can’t write assertions, even if they want to.\u003C/p>\u003Cp>Think of the batch job example again. To ensure that the invoices are generated correctly, the developer needs to make two or three HTTP calls to different services. Or maybe the batch job simply writes files on the server, and there’s no easy way to read them.\u003C/p>\u003Cp>Bad observability tends to happen more often in integration and system tests where you have multiple components and external parties working together. I’ll repeat my advice in the&nbsp;\u003Ci>Larger Tests\u003C/i>&nbsp;chapter of my book:&nbsp;\u003Cstrong>you should invest heavily in test infrastructure\u003C/strong>.\u003C/p>\u003Cp>For this particular batch job example, you may create an API that hides all the complexity of interacting with the many web services. From the test code, all the developer would then need to do is call a method, say, getGeneratedInvoices(), and the generated invoices are collected from the many services.\u003C/p>\u003Cp>You may spend some time building it, but once such an infrastructure is in place, writing such tests will be much easier. And more importantly, your tests will have proper, strong assertions.\u003C/p>\u003Cp>To sum up: The lack of observability may cause developers to write tests without assertions. Good test infrastructure is key to solving the issue.\u003C/p>\u003Cp>There should not be test steps without checks.\u003C/p>\u003Cp>Do not make test steps like this:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should open menu\", async () =&gt; {\u003C/p>\u003Cp>  await page.locator('.button').click();\u003C/p>\u003Cp>});\u003C/p>\u003C/blockquote>\u003Cp>Each test step has to have an assertion:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should open menu\", async () =&gt; {\u003C/p>\u003Cp>  await page.locator('.button').click();\u003C/p>\u003Cp>  const locator = await page.locator('.dropdown-menu');\u003C/p>\u003Cp>  await expect(locator).toBeVisible();\u003C/p>\u003Cp>});\u003C/p>\u003C/blockquote>\u003Ch3>No assertions in before or after hooks\u003C/h3>\u003Cp>Assertions shouldn't be used in the beforeAll, beforeEach, afterAll, or afterEach hooks. Only pure actions should be included in preconditions and postconditions (for example authorization). Tests ought to have checks.\u003C/p>\u003Cp>Use try...catch and/or throw errors if you still need to check something in the preconditions or postconditions.\u003C/p>\u003Ch3>No actions without expectations\u003C/h3>\u003Cp>All test actions, including clicks, hovers, and gotos, should be assertions with the&nbsp;expectation of verification that the action was actually taken.\u003C/p>\u003Cp>Example 1:-\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should open menu\", async () =&gt; {\u003Cbr>await page.locator('.button').click();\u003Cbr>await page.locator('.dropdown-menu').waitFor({ state: 'visible' });\u003Cbr>});&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u003C/p>\u003C/blockquote>\u003Cp>Example 2:-\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should open menu\", async () =&gt; {\u003Cbr>await page.locator('.button').click();\u003Cbr>const locator = await page.locator('.dropdown-menu');\u003Cbr>await expect(locator).toBeVisible();\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>The second example is valid because expect(locator).toBeVisible() contains conditional expectation.\u003C/p>\u003Ch3>No unconditional expectation\u003C/h3>\u003Cp>Do not add&nbsp;\u003Ca href=\"https://webdriver.io/docs/api/browser/pause/\">pause\u003C/a>&nbsp;and timeouts for N seconds between action and assertion to prevent flakiness — it only slows down the tests.\u003C/p>\u003Cp>Instead of unconditional expectation:\u003C/p>\u003Cblockquote>\u003Cp>it('Should open menu', async () =&gt; {\u003Cbr>  const button = await $('.button');\u003Cbr>  await button.click();\u003Cbr>  await browser.pause(3000);\u003Cbr>  const menu = await $('.dropdown-menu');\u003Cbr>  await menu.isDisplayedInViewport();\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Use&nbsp;\u003Ca href=\"https://webdriver.io/docs/api/element/waitForExist\">wait for something\u003C/a>&nbsp;(for some element’s state):\u003C/p>\u003Cblockquote>\u003Cp>it('Should open menu', async () =&gt; {\u003Cbr>  const button = await $('.button');\u003Cbr>  await button.click();\u003Cbr>  const menu = await $('.dropdown-menu');\u003Cbr>  await menu.waitForExist({timeout: 3000});\u003Cbr>  await menu.isDisplayedInViewport();\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>The second example works faster in case of passing the test and will fail for obvious and unambiguous reasons.\u003C/p>\u003Ch3>No commented test\u003C/h3>\u003Cp>If the test should be turned off, it should be skipped by test framework feature&nbsp;(skip), not by commented code.\u003C/p>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>// test(\"Should have a menu\", async () =&gt; {\u003C/p>\u003Cp>//&nbsp; const locator = await page.locator('.dropdown-menu');\u003C/p>\u003Cp>//&nbsp; await expect(locator).toBeVisible();\u003C/p>\u003Cp>// });\u003C/p>\u003C/blockquote>\u003Cp>Do:\u003C/p>\u003Cblockquote>\u003Cp>test.skip(\"Should have a menu\", async () =&gt; {\u003C/p>\u003Cp>  const locator = await page.locator('.dropdown-menu');\u003C/p>\u003Cp>  await expect(locator).toBeVisible();\u003C/p>\u003Cp>});\u003C/p>\u003C/blockquote>\u003Cp>The number of skipped tests will be presented in the test report.\u003C/p>\u003Cp>If the test is outdated and/or not needed it should be deleted without regret.\u003C/p>\u003Ch3>No hanging locators\u003C/h3>\u003Cp>Tests should not contain lines of code with «meaningless» locators:\u003C/p>\u003Cp>test(\"Should do something\", async () =&gt; {\u003C/p>\u003Cp>  await page.locator('.button');\u003C/p>\u003Cp>  …The code in the tests has to do something: perform actions and/or assertions.\u003C/p>\u003Ch3>One expect for each test step\u003C/h3>\u003Cp>Each test step should only check one thing, and test steps should be brief.\u003C/p>\u003Cp>One test step should not contain more than one or two assertions.\u003C/p>\u003Cp>Avoid attempting to complete all tasks and/or checks in one go.\u003C/p>\u003Cp>The more \"atomic\" the test procedures, the more understandable the test logs and results will be.\u003C/p>\u003Ch3>Do not put await inside expect\u003C/h3>\u003Cp>One operation inside another operation leads to a complication.\u003C/p>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have title on the button\", async () =&gt; {\u003Cbr>expect(await page.locator('.button')).toHaveText(/Menu/);\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Do:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have title on the button\", async () =&gt; {\u003Cbr>const button = await page.locator('.button');\u003Cbr>expect(button).toHaveText(/Menu/);\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>It is more verbose, but less chance to forget about await.\u003C/p>\u003Ch3>Do not reload the page, reopen it\u003C/h3>\u003Cp>Refreshing a page by a standard command (page.reload()&nbsp;for Playwright or&nbsp;browser.refresh()&nbsp;for WebdriverIO) is not a good idea — it makes the test flaky.\u003C/p>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have something after reload\", async () =&gt; {\u003Cbr>await page.reload();\u003Cbr>…\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Get the current page URL and just open it:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have something after reload\", async () =&gt; {\u003Cbr>const uri = await page.url();\u003Cbr>await page.goto(uri);\u003Cbr>…\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>This makes tests robust.\u003C/p>\u003Cp>This pattern also applies for&nbsp;\u003Ca href=\"https://playwright.dev/docs/api/class-page#page-go-back\">goBack()\u003C/a>&nbsp;and&nbsp;\u003Ca href=\"https://playwright.dev/docs/api/class-page#page-go-forward\">goForward()\u003C/a>&nbsp;methods, but unfortunately does not fit for&nbsp;\u003Ca href=\"https://developer.mozilla.org/en-US/docs/Glossary/SPA\">SPA web applications\u003C/a>&nbsp;in which the state of the page can differ from the URL.\u003C/p>\u003Ch3>Do not check URLs through includes\u003C/h3>\u003Cp>Do not use&nbsp;\u003Ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\">string.prototype.includes()\u003C/a>&nbsp;for string comparison in assertions, because includes() returns&nbsp;\u003Cstrong>true&nbsp;\u003C/strong>or&nbsp;\u003Cstrong>false\u003C/strong>. When your check fails, you will get a report that&nbsp;\u003Cstrong>false is not true\u003C/strong>&nbsp;— and no more details.\u003C/p>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have corresponding URL\", async () =&gt; {\u003Cbr>const uri = await page.url();\u003C/p>\u003Cp>await expect(uri.includes('example')).toBeTruthy();\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Use&nbsp;\u003Ca href=\"https://playwright.dev/docs/test-assertions#page-assertions-to-have-url\">appropriate method\u003C/a>:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have corresponding URL\", async () =&gt; {\u003Cbr>const uri = await page.url();\u003Cbr>await expect(uri).toHaveURL(/example/);\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Or&nbsp;\u003Ca href=\"https://jestjs.io/docs/expect#expectstringcontainingstring\">builtin assertions\u003C/a>&nbsp;in case of an unusual checks:\u003C/p>\u003Cblockquote>\u003Cp>test(\"Should have corresponding URL\", async () =&gt; {\u003Cbr>const uri = await page.url();\u003Cbr>await expect(uri).toEqual(expect.stringContaining('example'));\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>This pattern applies for checking any strings and affects the readability and clarity of test reports.\u003C/p>\u003Ch3>Avoid regexp in checks\u003C/h3>\u003Cp>Regular expression checks make tests too sensitive and do not significantly increase test reliability, but they do make it more challenging to evaluate test failures.\u003C/p>\u003Cp>Two exceptions exist:\u003C/p>\u003Cp>regexp for URL verification;\u003C/p>\u003Cp>date and time regexp.\u003C/p>\u003Cp>Both of these sorts of data are appropriate for regexp testing.\u003C/p>\u003Cp>Regexp testing is also acceptable if your testing project involves domain-specific IDs that can be linked to a pattern.\u003C/p>\u003Ch2>Wrap clicks and expectations into a promise\u003C/h2>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>await page.locator('.button').click();\u003Cbr>const response = await page.waitForResponse('https://example.com/');\u003Cbr>await expect(response.ok()).toBe(true);\u003C/p>\u003C/blockquote>\u003Cp>Do:\u003C/p>\u003Cblockquote>\u003Cp>const [response] = await Promise.all([\u003Cbr>page.waitForResponse('https://example.com/'),\u003Cbr>page.locator('.button').click(),\u003Cbr>]);\u003Cbr>await expect(response.ok()).toBe(true);\u003C/p>\u003C/blockquote>\u003Cp>\u003Ca href=\"https://playwright.dev/docs/api/class-page#page-wait-for-response\">Promise.all prevents a race condition between clicking and waiting\u003C/a>&nbsp;for something. The first example is likely to be extremely flaky.\u003C/p>\u003Ch3>Do not use global variables for page object methods\u003C/h3>\u003Cp>Isolate tests/steps from each other. Do not use global variables which are used and rewritten by multiple test steps in a single test suite.\u003C/p>\u003Cp>Instead of:\u003C/p>\u003Cblockquote>\u003Cp>const myPageObject = new MyPageObject(page);test('Should do something', async () =&gt; {\u003Cbr>await myPageObject.doSomething();\u003Cbr>…\u003Cbr>});test('Should have something', async () =&gt; {\u003Cbr>await myPageObject.haveSomething();\u003Cbr>…\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>Do:\u003C/p>\u003Cblockquote>\u003Cp>test('Should do something', async () =&gt; {\u003Cbr>const myPageObject = new MyPageObject(page);\u003Cbr>await myPageObject.doSomething();\u003Cbr>…\u003Cbr>});test('Should have something', async () =&gt; {\u003Cbr>const myPageObject = new MyPageObject(page);\u003Cbr>await myPageObject.haveSomething();\u003C/p>\u003Cp>…\u003Cbr>});\u003C/p>\u003C/blockquote>\u003Cp>If variables are not rewritten, it reduces the probability of rewriting them incorrectly or asynchronously — it increases the overall stability of the tests. \u003C/p>\u003Ch3>Do not scatter test cases\u003C/h3>\u003Cp>Everywhere should be checked using the same functionality.\u003C/p>\u003Cp>For instance, in test-1.spec.ts, check a banner using expect A, and in test-2.spec.ts, check the same banner (perhaps on a different page) using expect B. Instead, check the banner using both expects (A and B) in each of the tests (test-1.spec.ts and test-2.spec.ts).\u003C/p>\u003Ch3>Do not mix different kind of tests\u003C/h3>\u003Cp>Do two tests: an API test and a UI test if you wish to check the API and UI for a single user activity.\u003C/p>\u003Cp>Do two tests: the UI test and the screenshot test if you wish to simultaneously validate UI functioning and screenshot the layout.\u003C/p>\u003Cp>Do two integrated API tests, each of which performs specific checks, if you wish to simultaneously test JSON schemes and end-to-end API situations.\u003C/p>\u003Ch3>Use linters and formatters from the testing project\u003C/h3>\u003Cp>Tests should inherit linter and formatter rules from the testing (parent) project if a directory containing tests is situated inside the testing project, tests are located in a separate repository, or tests are developed by dedicated autotest engineers or developers.\u003C/p>\u003Cp>If the rules for ESLint and Prettier are the same, tests will be closer to the testing code (and autotest engineers will be closer to developers).\u003C/p>",117,"principles-of-writing-automated-tests","Principles of Writing Automated Tests","Tue, 27 Sep 2022 12:29:58 GMT","https://s3.eu-west-2.amazonaws.com/webtech.dev-documents/Blogs/117/images/2025-12-12iucckwc-principle_1.webp",{"APIToken":4},{"APIToken":4},[16],{"BlogDetails":7,"BlogID":8,"BlogSlug":9,"BlogTitle":10,"created_at":11,"mediaURL":12},[18],{"BlogDetails":7,"BlogID":8,"BlogSlug":9,"BlogTitle":10,"created_at":11,"mediaURL":12},[20,27,34,41],{"BlogDetails":21,"BlogID":22,"BlogSlug":23,"BlogTitle":24,"created_at":25,"mediaURL":26},"\u003Cp>For many facilities management teams, the real problem is not a lack of software. It is that jobs, assets, compliance records and contractor updates are spread across too many disconnected tools.\u003C/p>\u003Cp>A reactive job may be raised by email, assigned by phone, tracked in a spreadsheet and closed with evidence stored somewhere else entirely. That is where delays, missed updates and duplicated admin begin.\u003C/p>\u003Cp>Modern\u003Ca href=\"https://arez.io/cafm-system\"> \u003Cstrong>CAFM software\u003C/strong>\u003C/a> is designed to bring those processes together. But when comparing CAFM systems, which features actually matter?\u003C/p>\u003Ch2>\u003Cstrong>What Is CAFM Software?\u003C/strong>\u003C/h2>\u003Cp>CAFM stands for \u003Cstrong>Computer-Aided Facilities Management\u003C/strong>.\u003C/p>\u003Cp>It is software used to manage facilities operations including reactive maintenance, Planned Preventative Maintenance (PPM), assets, contractors, compliance, job evidence and reporting.\u003C/p>\u003Cp>Instead of relying on spreadsheets, inboxes and paper records, CAFM software creates one central operational record for office teams, engineers, suppliers and clients.\u003C/p>\u003Ch2>\u003Cstrong>What Should You Compare in CAFM Software?\u003C/strong>\u003C/h2>\u003Ch3>\u003Cstrong>Reactive Maintenance\u003C/strong>\u003C/h3>\u003Cp>Reactive maintenance is one of the core functions of any CAFM system.\u003C/p>\u003Cp>Jobs should be easy to log, prioritise, assign and track from initial request through to completion. Managers need clear visibility of what is open, overdue or waiting for action without relying on phone calls or manual spreadsheets.\u003C/p>\u003Ch3>\u003Cstrong>Planned Preventative Maintenance\u003C/strong>\u003C/h3>\u003Cp>PPM software should do more than simply store maintenance dates.\u003C/p>\u003Cp>A modern CAFM system should automatically generate recurring jobs, show upcoming and overdue maintenance, and link completed visits back to the relevant site or asset.\u003C/p>\u003Cp>This helps facilities teams maintain stronger control over servicing and compliance requirements.\u003C/p>\u003Ch3>\u003Cstrong>Asset Management\u003C/strong>\u003C/h3>\u003Cp>A useful asset register should connect each asset to its maintenance history.\u003C/p>\u003Cp>Engineers and managers should be able to see previous jobs, servicing records, certificates and recurring faults against the same asset.\u003C/p>\u003Cp>This makes it easier to understand performance and identify equipment that may require further attention.\u003C/p>\u003Ch3>\u003Cstrong>Mobile Working\u003C/strong>\u003C/h3>\u003Cp>Engineers need a CAFM mobile app that works in the field, not just a system designed for office users.\u003C/p>\u003Cp>They should be able to view assigned jobs, access site information, complete forms, upload photographs and record job evidence directly from their mobile device.\u003C/p>\u003Cp>Offline capability is also important for engineers working in plant rooms, basements or locations with poor connectivity.\u003C/p>\u003Ch3>\u003Cstrong>Contractor and Supplier Management\u003C/strong>\u003C/h3>\u003Cp>Facilities management often involves both internal engineers and external contractors.\u003C/p>\u003Cp>A CAFM platform should allow suppliers to receive jobs, assign workers, provide updates and upload evidence directly into the system.\u003C/p>\u003Cp>This reduces the need to manage subcontractors through separate emails, calls and spreadsheets.\u003C/p>\u003Ch3>\u003Cstrong>Compliance and Audit Trails\u003C/strong>\u003C/h3>\u003Cp>Compliance information should be easy to find when it matters.\u003C/p>\u003Cp>Certificates, RAMS, inspections, forms and other supporting documentation should be linked directly to the relevant job, site, supplier or asset.\u003C/p>\u003Cp>A clear digital audit trail makes it easier to demonstrate what work was completed, when it happened and who carried it out.\u003C/p>\u003Ch3>\u003Cstrong>Job Evidence\u003C/strong>\u003C/h3>\u003Cp>Photos, engineer notes, forms, timestamps and completion records provide evidence that work has actually been completed.\u003C/p>\u003Cp>For FM contractors, this is particularly important because strong job evidence can reduce disputes, support client reporting and help ensure completed jobs are ready for invoicing.\u003C/p>\u003Ch3>\u003Cstrong>Quotes and Invoicing\u003C/strong>\u003C/h3>\u003Cp>Operational and commercial workflows should connect.\u003C/p>\u003Cp>Ideally, a job can move from initial request to quote, approval, remedial work and invoicing without teams manually entering the same information into multiple systems.\u003C/p>\u003Cp>This reduces administration and can help completed work move towards invoicing faster.\u003C/p>\u003Ch3>\u003Cstrong>Reporting and Dashboards\u003C/strong>\u003C/h3>\u003Cp>CAFM dashboards should help managers understand what requires attention.\u003C/p>\u003Cp>Useful reporting can include open jobs, response times, PPM performance, contractor activity, compliance status and operational KPIs.\u003C/p>\u003Cp>The important question is whether the reporting helps teams take action rather than simply presenting more data.\u003C/p>\u003Ch2>\u003Cstrong>Traditional CAFM vs Modern CAFM\u003C/strong>\u003C/h2>\u003Cp>Older CAFM systems often focused heavily on storing records.\u003C/p>\u003Cp>Modern platforms increasingly connect job management, assets, compliance, mobile working, contractors and commercial processes into one workflow.\u003C/p>\u003Cp>The difference is less about having more individual features and more about how well those features work together.\u003C/p>\u003Cp>For example, a modern CAFM system should allow an engineer's job evidence to update the same job record used by operations, compliance and finance teams.\u003C/p>\u003Cp>That connected workflow can remove significant amounts of duplicate administration.\u003C/p>\u003Ch2>\u003Cstrong>How Is AI Changing CAFM Software?\u003C/strong>\u003C/h2>\u003Cp>AI is becoming an increasingly important part of modern facilities management software.\u003C/p>\u003Cp>Rather than replacing facilities managers or engineers, AI can help reduce repetitive administrative work.\u003C/p>\u003Cp>It can assist with job triage, summarise job histories, review documentation and highlight operational exceptions that may otherwise require manual investigation.\u003C/p>\u003Cp>For facilities teams managing thousands of jobs, even small improvements in how quickly information can be reviewed can make a significant difference.\u003C/p>\u003Ch2>\u003Cstrong>How Does Arez Compare?\u003C/strong>\u003C/h2>\u003Cp>Arez is designed as a modern CAFM and field service management platform that connects operational processes rather than treating them as separate systems.\u003C/p>\u003Cp>With \u003Ca href=\"https://arez.io/fieldiq\">\u003Cstrong>FieldIQ\u003C/strong>\u003C/a>, teams can manage reactive jobs, PPM schedules, assets, sites, suppliers, compliance records, job evidence, quotes and invoicing from one platform.\u003C/p>\u003Cp>External suppliers can receive and manage assigned work, while engineers can update jobs and capture evidence from the field.\u003C/p>\u003Cp>Arez also uses AI to help reduce administrative workload, review job information and provide greater visibility across operations.\u003C/p>\u003Cp>For organisations comparing platforms, you can explore\u003Ca href=\"https://arez.io/industries/facilities-management-software\"> \u003Cstrong>CAFM software for UK facilities management\u003C/strong>\u003C/a> to see how Arez connects jobs, assets, maintenance, contractors and compliance.\u003C/p>\u003Ch2>\u003Cstrong>What Else Should You Consider?\u003C/strong>\u003C/h2>\u003Cp>Features are only part of the decision.\u003C/p>\u003Cp>A CAFM system also needs to be easy for engineers and office teams to adopt, practical to use on mobile devices and capable of scaling as your organisation grows.\u003C/p>\u003Cp>You should also consider implementation, data migration, integrations, user permissions and ongoing support.\u003C/p>\u003Cp>A powerful system delivers little value if your team finds it difficult to use.\u003C/p>\u003Ch2>\u003Cstrong>CAFM Software Comparison Checklist\u003C/strong>\u003C/h2>\u003Cp>When comparing CAFM providers, ask whether the system can:\u003C/p>\u003Cul>\u003Cli>Manage reactive and planned maintenance together\u003C/li>\u003Cli>Link assets to complete maintenance histories\u003C/li>\u003Cli>Support engineers through a mobile app\u003C/li>\u003Cli>Manage suppliers and subcontractors\u003C/li>\u003Cli>Capture job evidence and compliance records\u003C/li>\u003Cli>Connect quotes, approvals and invoicing\u003C/li>\u003Cli>Manage multiple sites and customers\u003C/li>\u003Cli>Provide role-based permissions\u003C/li>\u003Cli>Integrate with existing business software\u003C/li>\u003Cli>Scale as job volumes and teams grow\u003C/li>\u003C/ul>\u003Cp>The goal is not to find the platform with the longest feature list. It is to find the one that best supports the way your organisation actually operates.\u003C/p>\u003Cp>\u003Cstrong>Final Thoughts\u003C/strong>\u003C/p>\u003Cp>There is no single CAFM system that is right for every organisation.\u003C/p>\u003Cp>A national FM contractor managing thousands of jobs has very different requirements from a small facilities team responsible for a handful of sites.\u003C/p>\u003Cp>The best approach is to map out how jobs, assets, contractors, compliance and commercial processes currently move through your business, then assess how well each CAFM platform connects those workflows.\u003C/p>\u003Cp>For organisations looking to reduce disconnected processes and improve operational visibility, a modern CAFM platform such as \u003Cstrong>Arez\u003C/strong> can bring maintenance, compliance, assets, contractors and reporting together in one place.\u003C/p>\u003Cp>\u003Cstrong>FAQs\u003C/strong>\u003C/p>\u003Cp> \u003C/p>\u003Ch4>\u003Cstrong>What is CAFM software?\u003C/strong>\u003C/h4>\u003Cp>\u003Cbr>CAFM software is used to manage maintenance, assets, compliance, contractors and facilities operations from one central platform.\u003Cbr> \u003C/p>\u003Ch4>\u003Cstrong>What features should a CAFM system have?\u003C/strong>\u003C/h4>\u003Cp>\u003Cbr>Key features include reactive maintenance, PPM scheduling, asset management, mobile working, contractor management, compliance records, reporting and commercial workflows.\u003Cbr> \u003C/p>\u003Ch4>\u003Cstrong>Can CAFM software manage planned and reactive maintenance?\u003C/strong>\u003C/h4>\u003Cp>\u003Cbr>Yes. Modern CAFM systems typically manage both planned preventative maintenance and reactive jobs within the same platform.\u003Cbr> \u003C/p>\u003Ch4>\u003Cstrong>What should I look for when comparing CAFM software?\u003C/strong>\u003C/h4>\u003Cp>\u003Cbr>Look beyond feature lists. Consider mobile usability, integrations, reporting, implementation, scalability, data migration, permissions and ongoing support.\u003Cbr> \u003C/p>\u003Ch4>\u003Cstrong>Is CAFM software suitable for growing FM companies?\u003C/strong>\u003C/h4>\u003Cp>\u003Cbr>Yes. CAFM software becomes increasingly valuable as job volumes, sites, engineers, contractors and compliance requirements grow.\u003C/p>",219,"cafm-software-comparison-what-features-should-a-modern-facilities-management-system-have","CAFM Software Comparison: What Features Should a Modern Facilities Management System Have?","Fri, 21 Aug 2026 13:54:55 GMT","https://s3.eu-west-2.amazonaws.com/webtech.dev-documents/Blogs/219/images/2026-08-21svtunqc-WebTech.jpg",{"BlogDetails":28,"BlogID":29,"BlogSlug":30,"BlogTitle":31,"created_at":32,"mediaURL":33},"\u003Ch2>\u003Cstrong>What Is Arez.io?\u003C/strong>\u003C/h2>\u003Cp>Arez.io is a UK-built, cloud-based job and workforce management platform designed specifically for field service and facilities management companies. It combines job scheduling, customer relationship management (CRM), compliance tracking, workforce management, and invoicing into one AI-powered system.\u003C/p>\u003Cp>The platform was developed by EarnFlex, a UK technology group specializing in workforce and compliance automation. What started as an internal tool for managing EarnFlex's own operations has since grown into a platform used by field service and FM businesses across the UK, with growing adoption in the US, Australia, New Zealand, and Europe.\u003C/p>\u003Cp>Arez describes itself as \"compliance-first\" — rather than treating compliance as an afterthought or a separate checklist, it's woven directly into how jobs are created, scheduled, and paid for. If a worker's certification or vetting has lapsed, the system can stop that job, payment, or shift from proceeding automatically.\u003C/p>\u003Ch2>\u003Cstrong>Who Uses Arez.io?\u003C/strong>\u003C/h2>\u003Cp>Arez.io is built for a broad range of trades and service industries, including:\u003C/p>\u003Cul>\u003Cli>HVAC contractors\u003C/li>\u003Cli>Plumbing and heating companies\u003C/li>\u003Cli>Electrical contractors\u003C/li>\u003Cli>Security service providers\u003C/li>\u003Cli>Cleaning companies\u003C/li>\u003Cli>Facilities management (FM) businesses\u003C/li>\u003Cli>Drainage and gas engineering firms\u003C/li>\u003Cli>Snow removal and winter services companies\u003C/li>\u003Cli>Construction and labour-supply businesses\u003C/li>\u003C/ul>\u003Cp>Because the platform is modular, a small business can start with basic job scheduling and layer on additional modules — like workforce vetting or asset management — as it grows.\u003C/p>\u003Ch2>\u003Cstrong>What Does Arez.io Offer? Core Features Breakdown\u003C/strong>\u003C/h2>\u003Ch3>\u003Cstrong>Job Scheduling and Dispatch\u003C/strong>\u003C/h3>\u003Cp>Managers can assign jobs using drag-and-drop calendars, factoring in engineer skills, availability, and location. Jobs — from planned maintenance to urgent call-outs — are routed to the right technician automatically, and progress is tracked in real time so office staff always know where things stand.\u003C/p>\u003Ch3>\u003Cstrong>AI-Powered Compliance Automation\u003C/strong>\u003C/h3>\u003Cp>This is where Arez.io stands apart from many competitors. The system uses AI to catch expired certificates, monitor Risk Assessment and Method Statements (RAMS), and flag compliance gaps before they turn into problems. For security and staffing businesses, it continuously checks worker vetting against standards such as SIA licensing and BS7858, blocking non-compliant staff from being scheduled or paid.\u003C/p>\u003Ch3>\u003Cstrong>Built-In CRM\u003C/strong>\u003C/h3>\u003Cp>Arez.io includes a native CRM that keeps customer history, quotes, jobs, and invoices in one searchable place. Businesses can capture new leads from their website, phone calls, or referrals, and automate follow-ups so fewer enquiries slip through the cracks.\u003C/p>\u003Ch3>\u003Cstrong>Free Mobile App for Every Engineer\u003C/strong>\u003C/h3>\u003Cp>Field workers get access to a mobile app (iOS and Android) at no extra cost — a notable difference from platforms that charge per mobile seat. The app works offline as well as online, letting engineers view job details, fill out digital forms, snap photos, and collect signatures on-site, with everything syncing to the office once a connection is available.\u003C/p>\u003Ch3>\u003Cstrong>Proof of Presence and Lone Worker Safety\u003C/strong>\u003C/h3>\u003Cp>For teams spread across multiple sites, Arez.io offers facial recognition and geo-tagging to verify attendance, plus automated check-calls for lone worker safety. This is especially useful for security and cleaning companies that need auditable proof of coverage for client contracts.\u003C/p>\u003Ch3>\u003Cstrong>SiteDB: Asset and Site Management\u003C/strong>\u003C/h3>\u003Cp>Arez.io's SiteDB feature ties jobs, planned preventive maintenance (PPM), documents, inspections, and assets to individual sites. This gives facilities managers a single view of every property's maintenance history, upcoming work, and compliance status — useful for both day-to-day planning and audit prep.\u003C/p>\u003Ch3>\u003Cstrong>Automated Invoicing and Payroll\u003C/strong>\u003C/h3>\u003Cp>Once a job wraps up, invoices can be generated and sent instantly, with online and card payment options built in. On the finance side, Arez.io automates timesheets, payroll calculations, and cost reconciliation, giving owners a clear, real-time view of wages, billing, and margins.\u003C/p>\u003Ch3>\u003Cstrong>Live Dashboards and Reporting\u003C/strong>\u003C/h3>\u003Cp>Business owners and managers get real-time dashboards covering job status, revenue, and workforce productivity — turning daily operational data into insights that support faster decisions.\u003C/p>\u003Ch2>\u003Cstrong>What Makes Arez.io Stand Out?\u003C/strong>\u003C/h2>\u003Cul>\u003Cli>\u003Cstrong>Compliance is built-in, not bolted on.\u003C/strong> Non-compliant workers can be automatically blocked from jobs, shifts, or payroll.\u003C/li>\u003Cli>\u003Cstrong>No hidden mobile costs.\u003C/strong> Every engineer gets full mobile app access included.\u003C/li>\u003Cli>\u003Cstrong>Modular and scalable.\u003C/strong> Businesses can add workforce management, vetting, or asset tracking modules as needed rather than paying for everything upfront.\u003C/li>\u003Cli>\u003Cstrong>Industry-specific setups.\u003C/strong> Rather than a generic one-size-fits-all tool, Arez.io offers tailored workflows for HVAC, electrical, plumbing, security, and FM businesses.\u003C/li>\u003C/ul>\u003Ch2>\u003Cstrong>Pricing\u003C/strong>\u003C/h2>\u003Cp>Arez.io's published pricing starts at around £89.95 per license per month, with additional modular packages (such as Arez FieldIQ) available depending on a business's needs. Because costs can vary based on company size, industry, and which modules are added, it's best to request a personalized quote or book a free demo directly on Arez.io for current pricing.\u003C/p>\u003Ch2>\u003Cstrong>Bottom Line\u003C/strong>\u003C/h2>\u003Cp>\u003Ca href=\"https://arez.io/\">Arez.io\u003C/a> offers field service and facilities management companies a way to consolidate scheduling, compliance, CRM, mobile fieldwork, and invoicing into a single AI-powered platform. Its compliance-first approach is particularly useful for regulated industries — like security, electrical, and HVAC — where a missed certificate or expired vetting document can carry serious financial or legal consequences.\u003C/p>\u003Cp>For businesses still relying on spreadsheets and disconnected apps, Arez.io is worth evaluating as a way to cut admin time, reduce compliance risk, and get a clearer real-time picture of the business.\u003C/p>\u003Cp> \u003C/p>\u003Cp> \u003C/p>\u003Cp>\u003Ci>Disclaimer: Features and pricing are subject to change. Visit Arez.io directly for the most current details or to book a demo.\u003C/i>\u003C/p>",218,"what-is-arez-io-and-what-does-it-offer","What Is Arez.io and What Does It Offer?","Mon, 27 Jul 2026 13:50:22 GMT","https://s3.eu-west-2.amazonaws.com/webtech.dev-documents/Blogs/218/images/2026-07-27rxrysic-dashboard_1.png",{"BlogDetails":35,"BlogID":36,"BlogSlug":37,"BlogTitle":38,"created_at":39,"mediaURL":40},"\u003Cp>Running a field service business is complex. Between scheduling engineers, keeping up with compliance requirements, managing paperwork, and chasing invoices — the operational load can feel endless. That's exactly the problem \u003Ca href=\"https://arez.io/\">\u003Cstrong>Arez.io\u003C/strong>\u003C/a> was built to solve.\u003C/p>\u003Cp>Arez.io is a cloud-based, AI-powered field service and facilities management platform designed to bring every aspect of a service business — jobs, engineers, compliance, customers, and finances — into one intelligent workspace. In this guide, we break down what Arez.io is, what it offers, who it's for, and why it's gaining rapid traction across the UK and beyond.\u003Cbr> \u003C/p>\u003Ch3>\u003Cstrong>What Is Arez.io?\u003C/strong>\u003C/h3>\u003Cp>Arez.io is a compliance-first job management software platform built specifically for field service and facilities management businesses. Originally developed for the UK market.\u003C/p>\u003Cp>At its core, Arez.io connects everything a field service business needs to operate: job scheduling, real-time tracking, mobile workforce tools, automated compliance management, quoting, invoicing, and customer relationship management — all from a single dashboard.\u003Cbr>\u003Cbr>\u003Ci>The platform is built around a simple but powerful mission: to make compliance, maintenance, and operations effortless through smart automation and data intelligence.\u003C/i>\u003C/p>\u003Ch3>\u003Cstrong>Who Is Arez.io For?\u003C/strong>\u003C/h3>\u003Cp>Arez.io is designed for a wide range of field service and facilities industries, including:\u003C/p>\u003Cul>\u003Cli>HVAC &amp; Plumbing businesses\u003C/li>\u003Cli>Electrical contractors\u003C/li>\u003Cli>Cleaning companies\u003C/li>\u003Cli>Security firms\u003C/li>\u003Cli>Drainage and utilities companies\u003C/li>\u003Cli>Gas engineers\u003C/li>\u003Cli>Construction businesses\u003C/li>\u003Cli>Winter services / snow removal providers\u003C/li>\u003Cli>Facilities management teams\u003C/li>\u003C/ul>\u003Cp>Whether a company has five engineers or fifty thousand, Arez.io is built to scale with the operation.\u003C/p>\u003Ch4>\u003Cstrong>Key Features of Arez.io\u003C/strong>\u003C/h4>\u003Cp>\u003Cstrong>1. AI-Powered Job Scheduling &amp; Dispatch\u003C/strong>\u003Cbr>Arez.io uses AI to intelligently assign tasks based on engineers' skills, availability, and compliance status. Managers can schedule jobs, dispatch workers, and track progress in real time — dramatically reducing the time spent on manual planning and improving the number of jobs completed per day.\u003C/p>\u003Cp>\u003Cstrong>2. Live GPS Tracking &amp; Real-Time Visibility\u003C/strong>\u003Cbr>Office managers gain full visibility of where every engineer is and what they're working on, in real time. Customers also receive automatic job confirmations, live status updates, and accurate arrival times — building trust and reducing inbound calls.\u003Cbr>\u003Cstrong>3. Automated Compliance Management\u003C/strong>\u003Cbr>Compliance is at the heart of Arez.io. The platform automatically flags missing certificates, overdue safety checks, and incomplete forms before they become business problems. It integrates with the Security Industry Authority (SIA) database and the UK Home Office to run daily license and right-to-work checks on all field staff.\u003Cbr>\u003Cstrong>4. Free Mobile App for Engineers\u003C/strong>\u003Cbr>The Arez.io mobile app is available free for all engineers and subcontractors on iOS and Android. From the app, field staff can:\u003C/p>\u003Cul>\u003Cli>Receive and manage job assignments\u003C/li>\u003Cli>Complete digital checklists and risk assessments\u003C/li>\u003Cli>Upload photos and capture signatures\u003C/li>\u003Cli>Check in and out using facial recognition\u003C/li>\u003Cli>Work offline in areas with limited connectivity\u003C/li>\u003C/ul>\u003Cp>\u003Cstrong>5. Quoting, Invoicing &amp; Accounting Integrations\u003C/strong>\u003C/p>\u003Cp>Arez.io allows businesses to create professional quotes in minutes using pre-set templates and pricing libraries. Accepted quotes convert into active jobs instantly, and invoices can be sent the moment a job is complete. The platform integrates seamlessly with Xero, QuickBooks, and Sage to keep financial records in sync — reducing admin time by up to 50%.\u003C/p>\u003Cp>\u003Cstrong>6. SmartCert AI Document Management\u003C/strong>\u003C/p>\u003Cp>One of Arez.io's standout innovations is its AI-powered document scanner. Every site in Arez becomes a living digital entity — holding all its jobs, certificates, PPMs (planned preventive maintenance), and invoices in one place. Documents are AI-scanned and data-mapped, making it easy to query information naturally, such as asking: \"Which machines had the longest downtime this month?\" or \"Show me compliance gaps for London sites.\"\u003C/p>\u003Cp>\u003Cstrong>7. Worker Vetting &amp; Identity Verification\u003C/strong>\u003C/p>\u003Cp>For security-sector clients, Arez.io includes BS7858-compliant vetting tools, automated SIA license checks, right-to-work verification via the UK Home Office, and facial recognition proof-of-presence at shift check-in and check-out. It also integrates with Veriff for secure ID verification, reducing fraud risks during onboarding.\u003C/p>\u003Cp>\u003Cstrong>8. Specialist Products: FieldIQ &amp; FROST\u003C/strong>\u003C/p>\u003Cp>Arez.io offers two specialist modules within its platform:\u003C/p>\u003Cp>\u003Cstrong>FieldIQ \u003C/strong>— Full control over planned, reactive, and quoted work with built-in compliance, AI-assisted workflows, real-time job tracking, cost control, and payroll management.\u003C/p>\u003Cp>\u003Cstrong>FROST \u003C/strong>— A dedicated winter services management system that automatically schedules jobs based on live weather feeds, tracks snow depth, manages compliance, and helps businesses scale during peak demand.\u003C/p>\u003Cp>\u003Cstrong>Operate \u003C/strong>— Manage people, shifts, and compliance with AI-powered time and attendance — all in one seamless platform\u003C/p>\u003Ch4>\u003Cstrong>Why Choose Arez.io?\u003C/strong>\u003C/h4>\u003Cp>There are many field service management tools on the market, but Arez.io differentiates itself in several important ways:\u003C/p>\u003Cp>\u003Cstrong>Compliance-First Design: \u003C/strong>Unlike generic job management tools, compliance is embedded at every layer of the Arez platform — not bolted on as an afterthought.\u003C/p>\u003Cp>\u003Cstrong>Built for the UK Market: \u003C/strong>Arez.io is UK-native, meaning it's built around UK regulations, BS7858 standards, SIA requirements, and UK cloud infrastructure.\u003C/p>\u003Cp>\u003Cstrong>AI at the Core: \u003C/strong>From predictive scheduling to AI document scanning and compliance gap detection, Arez uses real AI to solve real operational problems.\u003C/p>\u003Cp>\u003Cstrong>Free for Field Workers: \u003C/strong>The mobile app is completely free for all engineers and subcontractors, keeping costs low and adoption high.\u003C/p>\u003Cp>\u003Cstrong>Transparent Pricing: \u003C/strong>No hidden fees — all core functionalities are included, with clearly communicated pricing for any add-ons.\u003C/p>\u003Ch4>\u003Cstrong>Final Thoughts\u003C/strong>\u003C/h4>\u003Cp>Arez.io is not just another job scheduling tool. It's a fully integrated, compliance-first, AI-powered platform built for the reality of running a field service business. By combining smart scheduling, real-time tracking, automated compliance, workforce management, and financial tools into one place, it eliminates the chaos of spreadsheets, disconnected apps, and manual admin.\u003Cbr>\u003Cstrong>Ready to transform your field service operations?\u003C/strong>\u003Cbr>\u003Ca href=\"https://arez.io/book-a-demo\">\u003Cstrong>Book a Demo\u003C/strong>\u003C/a>\u003C/p>",215,"what-is-arez-io-a-complete-guide-to-the-uk-s-leading-field-service-management-software","What Is Arez.io? A Complete Guide to the UK's Leading Field Service Management Software","Wed, 18 Mar 2026 09:39:26 GMT","https://s3.eu-west-2.amazonaws.com/webtech.dev-documents/Blogs/215/images/2026-03-18peoirxr-arez-pic.webp",{"BlogDetails":42,"BlogID":43,"BlogSlug":44,"BlogTitle":45,"created_at":46,"mediaURL":47},"\u003Cp>When we started \u003Cstrong>WebTech.dev\u003C/strong>, it wasn’t just to write clean code or launch pretty interfaces. It was because we believed there was a better way to build software — one that puts real business problems at the center.\u003C/p>\u003Cp>We saw a gap in the market:\u003Cbr>Too many companies were struggling with rigid off-the-shelf tools, overpriced solutions, or development teams that didn’t really understand the business behind the tech.\u003C/p>\u003Cp>We knew there had to be another way — and so we built it.\u003C/p>\u003Ch3>\u003Cstrong>Listening First, Coding Second\u003C/strong>\u003C/h3>\u003Cp>At WebTech.dev, we don’t jump straight into building features.\u003Cbr>We start by asking the right questions:\u003C/p>\u003Cul>\u003Cli>What problem are we solving?\u003Cbr>\u003Cbr> \u003C/li>\u003Cli>Why does it matter to your business?\u003Cbr>\u003Cbr> \u003C/li>\u003Cli>What does success actually look like?\u003Cbr>\u003Cbr> \u003C/li>\u003C/ul>\u003Cp>Then we design the smartest, simplest solution — and we build it fast, without cutting corners.\u003C/p>\u003Ch3>\u003Cstrong>From Startups to Enterprises\u003C/strong>\u003C/h3>\u003Cp>We’ve worked with fast-growing startups and complex enterprises alike, helping them:\u003C/p>\u003Cul>\u003Cli>Launch scalable SaaS platforms\u003Cbr>\u003Cbr> \u003C/li>\u003Cli>Modernize legacy systems\u003Cbr>\u003Cbr> \u003C/li>\u003Cli>Automate operations\u003Cbr>\u003Cbr> \u003C/li>\u003Cli>Improve efficiency and reduce cost\u003Cbr>\u003Cbr> \u003C/li>\u003C/ul>\u003Cp>But no matter the size of the business, the goal is always the same: \u003Cstrong>to solve real, business-critical problems with software that works.\u003C/strong>\u003C/p>\u003Ch3>\u003Cstrong>Built for Outcomes, Not Just Output\u003C/strong>\u003C/h3>\u003Cp>We’re not your typical agency.\u003Cbr>We’re your tech partner — working with you to build long-term value, not just ship short-term deliverables.\u003C/p>\u003Cp>If you're looking for a team that \u003Ci>gets it\u003C/i> — one that understands both business and tech — we’d love to chat.\u003C/p>\u003Cp>Let’s solve something important together.\u003C/p>",212,"why-we-started-webtech-dev-a-better-way-to-build-software-that-solves-real-problems","Why We Started WebTech.dev: A Better Way to Build Software That Solves Real Problems","Wed, 25 Jun 2025 12:39:08 GMT","https://s3.eu-west-2.amazonaws.com/webtech.dev-documents/Blogs/212/images/2025-12-16bkpxgst-solve-blog_1_11zon.webp",1787574620405]