285 results found with an empty search
- Explore 50+ Guides | HyperTest
We're glad you're on your learning journey! 🤩 Access to All Premium Documents 👇 Know!, How to download? Clear all
- 5 Steps To Build Your API Test Automation
Get Your Test Automation Suite Up and Running in a Day, Ditch the Manual Efforts Required. 07 Min. Read 14 August 2024 5 Steps To Build Your API Test Automation Vaishali Rastogi WhatsApp LinkedIn X (Twitter) Copy link Writing and maintaining test cases with Postman was all fun, until there was no agile development. Taking all the time to create collections, fire API calls, test APIs and then maintain all that was a thing of past. Now that the time demands the engineering teams to build fast and release faster, Postman and such tools can’t be of much help. HyperTest, our autonomous integration testing tool, can take away all the manual efforts required in Postman. Developers of companies like Skaud, Yellow.ai , Porter, Purplle, Zoop etc are already ahead of their deadlines and are able to focus on making the application better instead of being trapped in the never-ending cycle of writing and maintaining test cases. HyperTest has significantly reduced my test maintenance workload. No more juggling countless test cases or manually tracking API responses on Postman. It's a game-changer! Pratik Kumar, FLEEK TECHNOLOGIES Here’s an easy 5 step guide to build a robust API test automation suite: 1️⃣ Pick any service and install HyperTest SDK 2️⃣ Deploy your service normally either locally or any other environment. HyperTest will record all the incoming and outgoing traffic of that service in that environment. 3️⃣ Go to HyperTest dashboard of all incoming and outgoing calls of this service put together as end-to-end inetgration tests 4️⃣ Install HyperTest CLI. Run these tests on a new build of your service. It will catch regressions across your service response and outgoing calls. 5️⃣ You can make HyperTest tests part of your CI pipeline using pre-push commit hooks and sign-off every release using these autonomous test suites. 1. Installing HyperTest SDK To begin, you'll need to install the HyperTest SDK and its CLI tool. These are the core components that enable HyperTest to interact with your application and manage API test automation effectively. The installation process is straightforward and can be done using package managers like npm for Node.js applications. Once installed , you need to initialize the HyperTest SDK in your application, which typically involves adding a simple configuration file or command to integrate HyperTest with your app's codebase. 💡 Get started with HyperTest within 10 minutes of installation and start catching regressions from the very start. 2. Start your Application in Record Mode After setting up the SDK, you'll need to start your application in "record mode." This mode enables HyperTest to monitor and capture all the outbound API calls your application makes. When your application runs in this mode, HyperTest listens to the requests and the corresponding responses, creating a record of interactions with external services. This recording forms the basis for generating mock data that will be used during regression testing. 3. Introduce Live Traffic in Your Application To ensure HyperTest can capture a wide range of scenarios, introduce some live traffic to your application. This can be done by simulating user activity or running existing test scripts that make API calls. The HyperTest SDK will record the requests made to downstream services, along with their responses. These recordings are crucial for creating accurate mocks that simulate real-world conditions during regression testing. 💡 Invest in 100% automation and let your developers focus on speedy releases while ensuring quality code. 4. Use HyperTest CLI to run the Test Mode Once the recording phase is complete, you can use the HyperTest CLI to replay the recorded requests. During this phase, the actual API calls will be replaced with the previously recorded mock responses. This allows you to test your application in a controlled environment, ensuring that any changes in your code do not break existing functionality. After running these tests, HyperTest generates a regression report that highlights any discrepancies or issues detected. 5. Use the Dashboard to View All the Regressions The final step is to access the HyperTest Dashboard, where you can view the detailed regression/coverage report. It provides a comprehensive evaluation of your test results, including pass/fail statuses, differences between expected and actual responses, and more. This visualization helps you quickly identify and address any regressions introduced during development, ensuring your application remains stable and reliable. Want to see it action for your services? Book a demo now Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- Detailed Write-up | HyperTest
Discover how HyperTest leverages automation to catch regressions and guarantee immaculate code, all without manual effort. Automated Integration Testing for Developers Problem: The Integration Testing Gap in Fast-paced Development Developers of modern agile world struggle to release bug-free code fast and without risk because of lack of effective automation Agile teams place a lot of importance on unit tests which are useful in checking business logic but fail to test the integration layer i.e. the dependencies between services, that constitute more than 50% of all production issues. This problem becomes more acute in apps with service oriented architecture where it is not uncommon for downstream changes to cause upstream failures. Rapid development and limited visibility on inter-service dependence is the root cause of all integration issues. Inadequately tested code-base also adds technical debt over time that makes new development harder, forcing devs to spend excessive time fixing past issues which leads to dev burnout, low productivity and missing delivery deadlines. Hence developers working on distributed systems in high speed environments need a new approach that can autonomously test new code changes with all its dependencies i.e. external services, 3rd party APIs, databases and message queues, right at source so that they can focus all their time on development. Why Existing Solutions Weren't Enough: Developers needed a better way to bridge this gap. Unit testing frameworks, while valuable, couldn't address the complexities of service interactions. Existing integration testing solutions often lacked the ease of use and automation needed for rapid development cycles. The HyperTest Solution: HyperTest has developed a unique approach to automatically generate and refresh mocks that efficiently test code and its dependencies, ensuring seamless integration and functionality validation. HyperTest sets up as an SDK on any backend service (like an APM). It builds a trace for all the requests that hit the service with its outbound calls (for mocking). The correct behavior of the service is tested for regressions automatically when it undergoes a change. System Architect HyperTest Record and Replay (Test) Mode: Record Mode During the record phase, all requests hitting a service (SUT) are monitored, including all interactions between its components. This involves inputs, responses, and all outgoing calls. The recorded interactions can include function calls, network requests, message exchanges, or database queries. HyperTest’s SDK sits directly on top of the SUT and captures the complete flow of actions that the SUT follows to give back the response. Most of the common scenarios involve the SUT communicating with databases, downstream services, or sometimes any external third-party APIs or cloud services to generate the desired response for a specific request. The service response and the outgoing calls in the record mode are treated as the baseline behavior of the service. Test Mode Devs run HyperTest in test mode when a new change is ready. In this mode, the requests captured in the record phase are executed to generate the actual response of the service at that time by mocking away the dependencies. If the response changes due to modifications in status codes, content type, schema, data, and so on, HyperTest reports a regression. Mocking away dependencies ensures that actual calls to the database and other downstream components are not made in test mode. Instead, the previously captured requests and responses are used, completely eliminating the need to keep the dependencies available for testing. When these tests are run through HyperTest CLI, they generate a code coverage report highlighting covered and uncovered code paths. Testing Stateful flows without managing test data HyperTest's great value lies in giving teams the ability to test stateful applications without needing to create or manage test data. Ability to intelligently generate and refresh mocks gives it the capability to test the application exactly in the state it needs to be. To illustrate this, let's consider testing the sign-up functionality. Two possible scenarios can occur: 1.If a user signs up with an email address that has not been registered before, a new account needs to be created. 2.Alternatively, if a user already exists with the same email address, the application should respond with the message "the user already exists." HyperTest SDK will record both of these flows from the traffic, i.e., a new user trying to register and an existing user trying to register (negative flow). In test mode, when HyperTest runs both scenarios, it will have the recorded response from the database for both, testing them in the right state to report a regression if either of the behaviors regresses.
- Download: All Whitepapers | HyperTest
Download in-depth guides and reports on Integration testing with smart-mocking and how HyperTest tackles complex challenges. We're glad you're on your learning journey! 🤩 Here's a bonus: Access to all available whitepapers 👇 Clear all
- Mitigate API Breakage: Insights from the 2023 Regression Report
Explore the 2023 API Testing Report: key trends, impacts, and strategies for robust, reliable APIs. 05 Min. Read 9 July 2024 Mitigate API Breakage: Insights from the 2023 Regression Report WhatsApp LinkedIn X (Twitter) Copy link APIs are the backbone of modern digital ecosystems carrying up to 70% of the business logic of the application. They enable different software systems to communicate and share data seamlessly. As businesses increasingly rely on APIs to deliver services, the need for robust API testing has never been more critical. Since they play such a crucial role in an app, keeping them sane and tested at all times is a key thing to ensure the smooth functioning of your app. It not only helps identify issues early in the development process, but also prevent them from escalating into major problems that can disrupt business operations. The Danger of Regressions Regressions are changes that unintentionally break or degrade the functionality of an API. If not addressed promptly, regressions can turn into bugs that affect the user experience and lead to significant business losses. Common regressions include: 💡 Key Removals: Critical data keys being removed. 💡 Status Code Changes: Unexpected changes in response codes. 💡 Value Modifications: Alterations in expected data values. 💡 Data Type Changes: Shifts in data formats that cause errors. The Study: How We Did It? To understand the current landscape of API regression trends, we drew insights from our own product analytics for the entire year “2023”, which revealed a staggering 8.6 million regressions across various sectors. Our report compiles data from multiple industries, including eCommerce/Retail, SaaS, Financial Services, and Technology Platforms . Methodology Our analysis involved: Data Collection : Gathering regression data from diverse API testing scenarios. Sectoral Analysis : Evaluating the impact of regressions on different industries. Root Cause Investigation : Identifying the common causes of API regressions. Strategic Recommendations : Providing actionable insights to mitigate regressions. Key Findings ⏩API Regression Trends: A Snapshot Our study revealed that the most affected sectors by API regressions in 2023 are: eCommerce/Retail : 63.4% SaaS : 20.7% Financial Services : 8.3% Technology Platforms : 6.2% ⏩Common Types of Regressions Key Removed : 26.8% Status Code Changed : 25.5% Value Modified : 17.7% Data Type Changed : 11.9% ⏩Sectoral Metrics: Regressions & Test Runs Analysis Financial Services : Leading in total regressions (28.9%), followed by Technology Platforms (22.2%). Total Test Runs : Highest in SaaS and Financial Services sectors, indicating the critical need for robust testing practices. ⏩Root Cause Analysis Our investigation identified the following common causes of API regressions: Rapid API Changes : Frequent updates leading to instability. Server-side Limitations or Network Issues : Affecting API performance. Bad Data Inputs : Incorrect data leading to failures. Schema or Contract Breaches : Violations of predefined API structures. Strategic Recommendations To address these issues, we recommend: Building Robust Automation Testing Suites : Invest in agile testing tools that integrate well with microservices architectures. Testing Real-World Scenarios : Simulate actual usage conditions to uncover potential vulnerabilities. Adopting a Shift-Left Approach : Integrate testing early in the development lifecycle to anticipate and address potential regressions. Establishing Real-Time Monitoring : Quickly identify and address issues, especially in user-intensive sectors like e-commerce and financial services. Conclusion The 2023 State of API Testing Report highlights the critical role of effective regression testing in ensuring robust, reliable APIs. By addressing common causes of regressions and implementing strategic recommendations, organizations can significantly reduce the risk of API failures and enhance their development processes. For a deeper dive into the data, trends, and insights, we invite you to download the full report. Visit HyperTest's official website to access the complete "State of API Testing Report: Regression Trends 2023." Stay tuned for more insights and updates on the latest trends in API testing . Happy testing! Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- PACT Comparison | HyperTest
Explore the comprehensive comparison between PACT and HyperTest to understand how they revolutionize API contract testing PACT Comparison Card Aspect Without HyperTest With HyperTest Scope of assertions Units tests only verify the correctness of the code under test Integration style tests that verify correctness of code, API response, inter service contracts, queue messages and database queries Quality of assertions Hand written assertions might cover or miss logical correctness Programmatic assertions that are deeper and wider and cover every corner case Realism of test scenarios Build and test scenarios that devs believe they know Builds test from real-world scenarios and covers application faster than hand written tests PACT style contract tests Manual effort writing contract tests and updating if contract change Automatically generate contract tests and update if they change. Manual effort eliminated. Quality of contract Tests PACT style contract tests will catch change in schema but will miss change in data value HyperTest generated contract tests will catch schema changes as well as change in data value Collaboration If producer changes the contract for the consumer, it needs to update the PACT file for the consumer fails in production If producer updates the contract, consumer is immediately notified before producer merges to production Resilience to Changes Tests may become outdated and less effective as external services change without corresponding updates to test cases. Tests remain relevant and effective over time as Hypertest adapts to changes in external services. Test Maintenance Requires ongoing maintenance of tests to keep pace with changes. No maintenance. Tests and mocks are auto-generated and auto-refreshed. Scope of testing Limited to testing internal logic and behavior of code units. Will miss integration failures like breaking contracts b/w services Covers integration scenarios Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- Privacy Policy | HyperTest
HyperTest's Privacy Policy explains data collection, use, and your rights. Your use of the Service implies agreement with this policy. Privacy Policy Last updated: March 8th, 2023 This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You. We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. Interpretation and Definitions Interpretation The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural. Definitions For the purposes of this Privacy Policy: Account means a unique account created for You to access our Service or parts of our Service. Company (referred to as either “the Company”, “We”, “Us” or “Our” in this Agreement) refers to HyperTest, 90B, Delhi – Jaipur Expy, Udyog Vihar, Sector 18 Gurgaon, 122008, India. Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses. Country refers to: Haryana, India Device means any device that can access the Service such as a computer, a cellphone or a digital tablet. Personal Data is any information that relates to an identified or identifiable individual. Service refers to the Website. Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of theCompany, to perform services related to the Service or to assist the Company in analyzing how the Service is used. Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit). Website refers to HyperTest website, accessible from https://hypertest.co/ You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. Collecting and Using Your Personal Data Types of Data Collected Personal Data While using Our Service,We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to: Email address First name and last name Phone number Usage Data Usage Data Usage Data is collected automatically when using the Service. Usage Data may include information such as Your Device’s Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data. When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and otherdiagnostic data. We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.When you visit or log in to our website, cookies and similar technologies may be used by our online data partners or vendors to associate these activities with other personal information they or others have about you, including by association with your email or home address. We (or service providers on our behalf) may then send communications and marketing to these email or home addresses. You may opt out of receiving this advertising by visiting https://app.retention.com/optout Tracking Technologies and Cookies We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include: 1. Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies. 2. Flash Cookies. Certain features of our Service may use local stored objects (or Flash Cookies) to collect and store information about Your preferences or Your activity on our Service. Flash Cookies are not managed by the same browser settings as those used for Browser Cookies. For more information on how You can delete Flash Cookies, please read “Where can I change the settings for disabling, or deleting local shared objects?” available at https://helpx.adobe.com/flash-player/kb/disable-local-shared objectsflash.html#main_Where_can_I_change_the_settings_for_disabling__or_deleting_local_sha red_objects_ 3. Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example,recording the popularity of a certain section and verifying system and server integrity). Cookies can be “Persistent” or “Session” Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. You can learn more about cookies here: Cookies by Terms Feed Generator. We use both Session and Persistent Cookies for the purposes set out below: Necessary / Essential Cookies Type: Session Cookies Administered by: Us Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services. Cookies Policy / Notice Acceptance Cookies Type: Persistent Cookies Administered by: Us Purpose: These Cookies identify if users have accepted the use of cookies on the Website. Functionality Cookies Type: Persistent Cookies Administered by: Us Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website. For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy. Use of Your Personal Data The Company may use Personal Data for the following purposes: To provide and maintain our Service , including to monitor the usage of our Service. To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user. For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service. To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application’s push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation. To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information. To manage Your requests: To attend and manage Your requests to Us. For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred. For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience. We may share Your personal information in the following situations: 1. With Service Providers : We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You. 2. For business transfers : We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company. 3. With Affiliates : We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us. 4. With business partners : We may share Your information with Our business partners to offer You certain products, services or promotions. 5. With other users : when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside. 6. With Your consent : We may disclose Your personal information for any other purpose with Your consent. Retention of Your Personal Data The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies. The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods. Transfer of Your Personal Data Your information, including Personal Data, is processed at the Company’s operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the dataprotection laws may differ than those from Your jurisdiction. Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer. The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information. Disclosure of Your Personal Data Business Transactions If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy. Law enforcement Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency). Other legal requirements The Company may disclose Your Personal Data in the good faith belief that such action is necessary to: 1. Comply with a legal obligation 2. Protect and defend the rights or property of the Company 3. Prevent or investigate possible wrongdoing in connection with the Service 4. Protect the personal safety of Users of the Service or the public 5. Protect against legal liability Security of Your Personal Data The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security. Children’s Privacy Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers. If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent’s consent before We collect and use that information. Links to Other Websites Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party’s site. We strongly advise You to review the Privacy Policy of every site You visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services. Changes to this Privacy Policy We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page. We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the “Last updated” date at the top of this Privacy Policy. You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page. Contact Us If you have any questions about this Privacy Policy, You can contact us: By visiting this page on our website: https://hypertest.co/contact-us/
- Simplify Your Code: A Guide to Mocking for Developers
Confidently implement effective mocks for accurate tests. 07 Min. Read 8 April 2024 Simplify Your Code: A Guide to Mocking for Developers Shailendra Singh Vaishali Rastogi WhatsApp LinkedIn X (Twitter) Copy link You want to test your code but avoid dependencies? The answer is “ Mocking ”. Mocking comes handy whenever you want to test something that has a dependency. Let’s talk about mocking first in a little detail. What’s mocking, anyway? The internet is loaded with questions on mocking, asking for frameworks, workarounds and a lot more “ how-to-mock ” questions. But in reality, when discussing testing, many are unfamiliar with the purpose of mocking. Let me try by giving an example: 💡 Consider a scenario where you have a function that calculates taxes based on a person's salary, and details like salary and tax rates are fetched from a database. Testing with a database can make the tests flaky because of database unavailability, connection issues, or changes in contents affecting test outcomes. Therefore, a dev would just simply mock the database response i.e. the income and tax rates for the dummy data he is running his unit tests on. By mocking database interactions, results are deterministic which is what devs desire. Hope the concept is clear now, but when everything seems good with mocking, what’s the purpose of this article? Continue reading to get the answer to this question. All seems good with mocking, what’s the problem then? API mocking is typically used during development and testing as it allows you to build your app without worrying about 3rd party APIs or sandboxes breaking. But evidently, people still got some issues with mocking! Mocking Too Much is still a hot topic of discussion among tech-peers, but why do they have this opinion in the first place? This article is all about bringing out the real concerns people have with mocking. And presenting you a way that takes away all the mocking-related pain. 1️⃣ State Management Complexity Applications flows are fundamentally stateless. But database imputes state in a flow because it makes a flow contextual to a user journey. Imagine testing checkout, to do so the application should be in a state where a valid user has added a valid SKU with the required inventory. This means before running a test, we need to fill the database with the required data, execute the test, and then clean out the database once the test is over. This process, however, repetitive, time-consuming and with diminishing returns. Now, consider the complexity of handling numerous user scenarios. We'd have to prepare and load hundreds, maybe thousands, of different user data setups into the database for each test scenario. 2️⃣ False Positives/Negatives False positives in tests occur when a test incorrectly passes, suggesting code correctness despite existing flaws. This often results from mocks that don't accurately mimic real dependencies, leading to misplaced confidence. Conversely, false negatives happen when tests fail, indicating a problem where none exists, typically caused by overly strict or incorrect mock setups. Both undermine test reliability—false positives mask bugs, while false negatives waste time on non-issues. Addressing these involves accurate mock behavior, minimal mocking, and supplementing with integration tests to ensure tests reflect true system behavior and promote software stability. 3️⃣ Maintenance Overhead Assume UserRepository is updated to throw a UserNotFound exception instead of returning None when a user is not found. You have to update all tests using the mock to reflect this new behavior. # New behavior in UserRepository def find_by_id(user_id): # Throws UserNotFound if the user does not exist raise UserNotFound("User not found") # Updating the mock to reflect the new behavior mock_repository.find_by_id.side_effect = UserNotFound("User not found") Keeping mocks aligned with their real implementations requires continuous maintenance, especially as the system grows and evolves. HyperTest’s way of solving these problems We have this guide on why and how on HyperTest , just go through it once and then hop over here. To give you a brief: 💡 HyperTest makes integration testing easy for developers. What’s special is its ability to mock all the third-party dependencies including your databases, message queues, sockets and of course the dependent services. This behavior of autogenerating mocks that simulate dependencies not only streamline the test creation but also allow you to meet your development goals faster. The newer approach towards mocking Let’s understand this HyperTest approach by quoting an example scenario to make things easy to understand and explain. So imagine we’ve a shopping app and we need to write integration tests for testing it. 💡 The Scenario Imagine we have a ShoppingCartService class that relies on a ProductInventory service to check if products are available before adding them to the cart. The ProductInventory service has a state that changes over time; for example , a product might be available at one moment and out of stock the next. class ShoppingCartService: def __init__(self, inventory_service): self.inventory_service = inventory_service self.cart = {} def add_to_cart(self, product_id, quantity): if self.inventory_service.check_availability(product_id, quantity): if product_id in self.cart: self.cart[product_id] += quantity else: self.cart[product_id] = quantity return True return False 💡The Challenge To test ShoppingCartService 's add_to_cart method, we need to mock ProductInventory 's check_availability method. However, the availability of products can change, which means our mock must dynamically adjust its behavior based on the test scenario. 💡Implementing Stateful Behavior in Mocks To accurately test these scenarios, our mock needs to manage state. HyperTest’s ability to intelligently generate and refresh mocks gives it the capability to test the application exactly in the state it needs to be. To illustrate this, let's consider the shopping scenario again. Three possible scenarios can occur: The product is available, and adding it to the cart is successful. The product is not available, preventing it from being added to the cart. The product becomes unavailable after being available earlier, simulating a change in inventory state. HyperTest SDK will record all of these flows from the traffic, i.e., when the product is available, when the product is not available and also when there’s a change in the inventory state. In its test mode, when HyperTest runs all the three scenarios, it will have the recorded response from the database for all, testing them in the right state to report a regression if either of the behaviors regresses. I’ll now delve into how taking advantage of HyperTest’s capability of auto-generating mocks one can pace up the work and eliminate all the mocking-problems we discussed earlier . 1. Isolation of Services for Testing Isolating services for testing ensures that the functionality of each service can be verified independently of others. This is crucial in identifying the source of any issues without the noise of unrelated service interactions. HyperTest's Role: By mocking out third-party dependencies, HyperTest allows each service to be tested in isolation, even in complex environments where services are highly interdependent. This means tests can focus on the functionality of the service itself rather than dealing with the unpredictability of external dependencies. 2. Stability in Test Environments Stability in test environments is essential for consistent and reliable testing outcomes. Fluctuations in external services (like downtime or rate limiting) can lead to inconsistent test results. HyperTest's Role: Mocking external dependencies with HyperTest removes the variability associated with real third-party services, ensuring a stable and controlled test environment. This stability is particularly important for continuous integration and deployment pipelines, where tests need to run reliably at any time. 3. Speed and Efficiency in Testing Speed and efficiency are key in modern software development practices to enable rapid iterations and deployments. HyperTest's Role: By eliminating the need to interact with actual third-party services, which can be slow or rate-limited, HyperTest significantly speeds up the testing process. Tests can run as quickly as the local environment allows, without being throttled by external factors. 4. Focused Testing and Simplification Focusing on the functionality being tested simplifies the testing process, making it easier to understand and manage. HyperTest's Role: Mocking out dependencies allows testers to focus on the specific behaviors and outputs of the service under test, without being distracted by the complexities of interacting with real external systems. This focused approach simplifies test case creation and analysis. Let’s conclude for now HyperTest's capability to mock all third-party dependencies provides a streamlined, stable, and efficient approach to testing highly inter-dependent services within a microservices architecture. This capability facilitates focused, isolated testing of each service, free from the unpredictability and inefficiencies of dealing with external dependencies, thus enhancing the overall quality and reliability of microservices applications. Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- 3 reasons why Unit Tests aren't enough
Unit tests passing, but deployments crashing? There's more to the story. 07 Min. Read 8 March 2024 3 reasons why Unit Tests aren't enough Shailendra Singh WhatsApp LinkedIn X (Twitter) Copy link In the fast-paced world of software development, ensuring code quality and functionality is paramount. Unit testing plays a crucial role in achieving this by verifying individual units of code. However, while unit tests are essential, they have limitations , particularly when it comes to testing the interactions and communication between different services. This is where integration testing steps in. This article explores three key reasons why unit tests alone fall short and why integration testing deserves a prominent place in your development arsenal. 1. Unit Tests Live in Isolation: By design, unit tests focus on individual units of code in isolation. They mock external dependencies like databases or APIs, allowing for focused testing logic without external influences. While this fosters granular control, it creates a blind spot – the interactions between services. In modern, microservices-based architectures, service communication is the lifeblood of functionality. Unit tests fail to capture these interactions, leaving potential integration issues hidden until later stages of development or even worse, in production. Imagine this scenario: Your unit tests meticulously validate a service's ability to process user data. However, they don't test how the service interacts with the authentication service to validate user credentials. In this case, even a perfectly functioning service in isolation could cause a system-wide failure if it can't communicate with other services properly. Integration testing bridges this gap: By simulating real-world service interactions, it uncovers issues related to data exchange, dependency management, and communication protocols. Early detection of these integration problems translates to faster fixes, fewer regressions, and ultimately, a more robust and reliable system. Solved Problem with HyperTest: ➡️ HyperTest simulates the responses of outbound calls made by the service under test to its dependent services, including third-party APIs, databases, and message queues. ➡️ Furthermore, it rigorously tests and compares all outbound call requests against a pre-recorded stable version. This comparison not only checks for deviations in request parameters up to the API layer but also extends scrutiny down to the data layer. 2. Mocking limitations can mask integration problems Unit testing heavily relies on mocking external dependencies. While mocking provides control and simplifies testing logic, it doesn't always accurately represent real-world behavior. Mocks can't perfectly replicate the complexity and potential edge cases of real services. Here's an example: You mock a database dependency in your unit test for a service that writes data. The mock might return predictable results, but it can't simulate potential database errors or network issues. These real-world scenarios could cause integration issues that wouldn't be surfaced by unit tests alone. Integration testing brings real dependencies into play: By interacting with actual services or realistic simulations, it reveals how your code behaves in a more holistic environment. This allows developers to uncover issues that mocking can't capture, leading to a more comprehensive understanding of the system's behavior. Solved Problem with HyperTest: HyperTest's innovative AI-driven methodology for generating mocks sets it apart. It synchronizes test data with actual transactions and continually updates mocks for external systems. This approach notably improves testing for intricately interlinked services in microservices architectures. ➡️ Isolation of Services for Testing ➡️ Consistency in Test Environments ➡️ Acceleration and Efficiency in Testing ➡️ Streamlined Testing: Focus and Simplification 3. Unit tests miss how errors cascade across your system Unit tests excel at isolating and verifying individual components, but they can miss the domino effect of failures across services. In a complex system, a seemingly minor issue in one service can trigger a chain reaction of errors in other services that depend on it. For Instance: A unit test might verify that a service successfully retrieves data from a database. However, it wouldn't reveal how a bug in that service's data processing might corrupt data further down the line, impacting other service functionalities. Integration testing creates a more holistic test environment: By simulating real-world service interactions, it allows developers to observe and troubleshoot cascading failures that wouldn't be evident in isolated unit tests. This proactive approach helps identify and fix issues early in the development lifecycle, preventing them from propagating and causing larger disruptions later. Solved Problem with HyperTest: HyperTest autonomously identifies relationships between different services and catches integration issues before they hit production. Thorough Interaction Testing: HyperTest rigorously tests all service interactions, simulating diverse scenarios and data flows to uncover potential failure points and understand cascading effects on other services. Enhanced Root Cause Analysis: HyperTest traces service interactions to pinpoint the root cause of failures, facilitating swift troubleshooting and resolution by identifying the responsible component or service. Through a comprehensive dependency graph, teams can effortlessly collaborate on one-to-one or one-to-many consumer-provider relationships. Conclusion Unit testing remains a cornerstone of modern development, providing invaluable insights into code logic. However, it's crucial to recognize its limitations. By incorporating integration testing into your development process, you can bridge the gap between unit tests and real-world scenarios. Integration testing with HyperTest fosters a more comprehensive understanding of how your services interact, leading to the creation of robust, reliable, and ultimately, production-ready software. Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- Terms & Conditions | HyperTest
Terms of Use of HyperTest: Integration Testing made easy for Developers Terms & Conditions Last Updated: November 27, 2022 HyperTest, Inc. and its affiliates d/b/a HyperTest (“HyperTest”, “we”, “our”) welcome you (the “User(s)”, or “you”) to our primary website at https://hypertest.co/ (the “Site”). Our Site offers basic information regarding our company and our services and allows the Site’s Users to contact us as well as to apply for open positions at HyperTest (“Service(s)” as further detailed below). Each of the Site’s Users may use the Site in accordance with the terms and conditions hereunder. 1. Acceptance of the Terms By entering, connecting to, accessing or using the Site (as further detailed below), you acknowledge that you have read and understood the following terms of use, including the terms of our Privacy Policy available at: https://hypertest.co/privacy-policy/ (collectively, the “Terms”) and you agree to be bound by them and to comply with all applicable laws and regulations regarding your use of the Site and you acknowledge that these Terms constitute a binding and enforceable legal contract between HyperTest and you. IF YOU DO NOT AGREE TO THESE TERMS, PLEASE DO NOT ENTER TO, CONNECT TO, ACCESS OR USE THE SITE AND/OR THE SERVICES IN ANY MANNER. The Site is available only to individuals who (a) are at least sixteen (16) years old; and (b) possess the legal capacity to enter into these Terms (on behalf of themselves and their organization) and to form a binding agreement under any applicable law. You hereby represent that you possess the legal authority to enter into these Terms on your and your organization’s behalf and to form a binding agreement under any applicable law, to use the Site in accordance with these Terms, and to fully perform your obligations hereunder. For the avoidance of doubt, any act or omission performed by you in connection with the Site shall obligate your organization. 2. The Site and the Services HyperTest provides an API testing platform, provided as a software-as-a-services, that prevents API failures (such as data errors, contract failures and status code errors). The Site may provide you with comprehensive information regarding, inter-alia, HyperTest’s products and services, concept, company overview, company team, partners, contact information, a blog which serves as a resources library, news regarding our company, job opportunities and so forth, including any other content related thereto such as contact information, videos, photos, text, files, logos, button icons, images, data compilations, links, other specialized content, technical data, documentation, know-how, specifications materials, designs, data, the “look and feel” of the Site, algorithms, source and object code, interface, GUI, interactive features related graphics, illustrations, drawings, animations, and other features obtained from or through the Site (collectively, the “Content”). For the avoidance of doubt, the Site serves mainly as an informative marketing tool, and engagements of any sort with us, including, without limitation, purchasing a license to use our products and services, shall only be created on a first person basis (e.g. through a User’s meeting or discussion with the our representative). The Content does not bind HyperTest in any form, and in any case where the Content contradicts or is inconsistent with separate agreements executed directly between HyperTest and you, information supplied by HyperTest on a first person basis shall prevail. (collectively, the “Services”) ALL RIGHTS IN AND TO THE CONTENT AVAILABLE ON THE SITE ARE RESERVED TO HyperTest OR ITS LICENSORS. TO THE EXTENT LEGALLY PERMISSIBLE, THE SITE AND THE CONTENT AVAILABLE THEREIN ARE PROVIDED ON AN “AS IS” BASIS. HyperTest WILL NOT BE LIABLE FOR ANY DAMAGES OR LOSS INCURRED TO YOU OR ANY OTHER PERSON AS A RESULT OF OR IN CONNECTION WITH YOUR USE OF THE SITE AND/OR THE CONTENT AVAILABLE THEREIN. YOUR USE OF THE SERVICES AND/OR THE SITE AND/OR THE CONTENT AVAILABLE THEREIN IS ENTIRELY AT YOUR OWN RISK. Note: Use of our Site is currently free of charge. However, we reserve the right to charge fees for certain features or services available via our Site in the future. You hereby acknowledge and agree that you may be charged for Internet, maintenance of network connection and data usage charges made through use of the Site, according to the applicable rates charged by your respective third party Internet and data usage service provider as may be from time to time. 3. Contacting us via the Site In order to use the certain features of the Site, such as: contacting us, requesting a demo, product live tour and applying for a job, you will be required to provide us with certain personal details, including, inter alia first and last name, email address, telephone number, resume (as applicable), company name and any free content you will choose to share with us, and in order to respond to your requests, inquiries or application, we may collect certain Personal Information, as further detailed in our Privacy Policy. 4. User Generated Content The Site enables Users to share and upload, post, publish or make available their own copyrightable materials including texts, comments and any other proprietary materials, including via Facebook Comments (collectively, the “User Generated Content”). The following terms apply to User Generated Content: (a) you are responsible for any User Generated Content you provide, including compliance with applicable laws; (b) you represent and warrant that you are the rightful owner of the User Generated Content or that you have all the necessary licenses, rights, consents, and permissions from the licensors of such User Generated Content and that such User Generated Content does not infringe any third party’s intellectual property rights, privacy rights or publicity rights; (c) the User Generated Content will become publicly available to other Users of the Site and/or other users of applicable social networks, and therefore, is deemed non-confidential and you hereby waive any moral rights, privacy rights and publicity rights (as applicable) with respect thereto; (d) you understand and agree that you are solely responsible for your User Generated Content and the consequences of posting such User Generated Content; (e) you expressly agree that the User Generated Content will not include any unsolicited promotions, advertising, contests, raffles or content which is unlawful for you to possess, including but not limited to any content which is defamatory, libelous, pornographic, indecent, harassing, threatening, abusive or fraudulent; (f) although HyperTest has no obligation to screen, edit or monitor any of the User Generated Content, HyperTest explicitly reserves the right, at its sole discretion, to remove or edit, without giving any prior notice, any User Generated Content available on the Site at any time and for any reason; (g) you grant us a perpetual, non-exclusive, royalty-free, and worldwide license to publicly display, communicate, distribute, host, publicly perform, publish, reproduce, make modifications or derivative works, store and use such User Generated Content, in connection with the Site; (h) HyperTest TAKES NO RESPONSIBILITY AND ASSUMES NO LIABILITY FOR ANY USER GENERATED CONTENT UPLOADED, POSTED, PUBLISHED AND/OR MADE AVAILABLE BY YOU OR ANY THIRD PARTY ON THE SITE, FOR ANY LOSS OR DAMAGE THERETO OR FOR ANY LOSS OR DAMAGE IT MAY CAUSE THIRD PARTIES, NOR IS HyperTest LIABLE FOR ANY MISTAKES, DEFAMATION, LIBEL, FALSEHOODS, OBSCENITIES OR PORNOGRAPHY YOU OR ANY OTHER THIRD PARTY MAY ENCOUNTER WITH RESPECT TO THE USER GENERATED CONTENT. 5. Misconduct and Copyright Agent We care for your safety. If you believe a User acted inappropriately including (but not limited to) offensive, violent or sexually inappropriate behavior, or that your work has been copied in a way that constitutes copyright infringement, please report immediately such person to the appropriate authorities and to us at connect@hypertest.co . 6. Use Restrictions There are certain conducts which are strictly prohibited when using the Site. Please read the following restrictions carefully. Failure to comply with any of the provisions set forth herein may result (at HyperTest’s sole discretion) in the termination of your use of the Site and/or Content and may also expose you to civil and/or criminal liability. Unless otherwise explicitly permitted under these Terms or in writing by HyperTest, you may not (and you may not permit anyone to): (a) use the Site and/or the Content for any illegal, immoral, unlawful and/or unauthorized purposes; (b) use the Site and/or Content for non-personal or commercial purposes; (c) remove or disassociate, from the Content and/or the Site any restrictions and signs indicating proprietary rights of HyperTest or its licensors, including but not limited to any proprietary notices contained in such materials (such as ©,™, or ®); (d) interfere with or violate Users’ rights to privacy and other rights, or harvest or collect personally identifiable information about Users without their express consent, whether manually or with the use of any robot, spider, crawler, any search or retrieval application, or use other manual or automatic device, process or method to access the Site and retrieve, index and/or data-mine information; (e) interfere with or disrupt the operation of the Site or the servers or networks that host the Site, or disobey any laws, regulations, requirements, procedures, or policies of such servers or networks; (f) falsely state or otherwise misrepresent your affiliation with any person or entity, or express or imply that HyperTest endorses you, your site, your business or any statement you make, or present false or inaccurate information about the Site; (g) take any action that imposes, or may impose, an unreasonable or disproportionately large load on our platform infrastructure, as determined by us; (h) bypass any measures we may use to prevent or restrict access to the Site; (i) copy, modify, alter, adapt, make available, translate, port, reverse engineer, decompile, or disassemble any portion of the Content made accessible by HyperTest on or through the Site, or publicly display, reproduce, create derivative works from, perform, distribute, or otherwise use such Content; (j) copy, distribute, display, execute publicly, make available to the public, reduce to human readable form, decompile, disassemble, adapt, sublicense, make any commercial use, sell, rent, transfer, lend, process, compile, reverse engineer, combine with other software, translate, modify or create derivative works of any material that is subject to HyperTest’s proprietary rights, including HyperTest’s Intellectual Property (as such term is defined below), in any way or by any means; (k) make any use of the Content on any other site or networked computer environment for any purpose without HyperTest’s prior written consent; (l) create a browser or border environment around HyperTest Content (no frames or inline linking is allowed); (m) sell, license, or exploit for any commercial purposes any use of or access to the Site and/or the Content; (n) frame or mirror any part of the Site without HyperTest’s prior express written authorization; (o) create a database by systematically downloading and storing all or any of the Content from the Site; (p) transmit or otherwise make available in connection with the Site any virus, worm, Trojan Horse, time bomb, web bug, spyware, or any other computer code, file, or program that may or is intended to damage or hijack the operation of any hardware, software, or telecommunications equipment, or any other actually or potentially harmful, disruptive, or invasive code or component; (q) use the Site for any purpose for which the Site is not intended; and/or (r) infringe and/or violate any of the Terms. 7. Minors The Site is intended for Users over the age of sixteen (16). We reserve the right to request proof of age at any stage so that we can verify that minors under this age are not using the Site. In the event that it comes to our knowledge that a person under the age of sixteen (16) is using the Site, we will prohibit and block such User from accessing the Site and will make all efforts to promptly delete any Personal Information (as such term is defined in our Privacy Policy) with regard to such User. 8. Social Media Features The Site may include social sharing and posting features and other integrated tools (for example the Facebook “Share” buttons, YouTube, Twitter, LinkedIn etc.) (“Social Features“). The Social Features are operated or allow for social integration with certain third party social networks or third party Sites (“Social Network“). These are created and maintained by third parties who are not affiliated with and/or controlled by us. Your use of the Social Features is subject to the applicable third party Social Network terms of use and privacy policies. If you do not agree to the practices described in such terms you should not use the Site’s integration with such Social Networks, however you may find that you are not able to enjoy all the features available by our Service. HyperTest is not responsible and has no liability for your use of such Social Networks. 9. Privacy Policy We respect your privacy and are committed to protect the information you share with us. We believe that you have a right to know our practices regarding the information we collect when you connect to, access or use the Site. Our policy and practices and the type of information collected are described in details in our Privacy Policy at https://hypertest.co/privacy-policy/ which is incorporated herein by reference. You agree that HyperTest may use personal information that you provide or make available to HyperTest in accordance with the Privacy Policy. If you intend to access or use the Site you must first read and agree to the Privacy Policy. 10. Intellectual Property Rights The Site, the Content and HyperTest’s proprietary assets and any and all intellectual property rights pertaining thereto, including, but not limited to, inventions, patents and patent applications, trademarks, trade names, service marks, copyrightable materials, domain names and trade secrets, whether or not registered or capable of being registered (collectively, “Intellectual Property”), are owned by and/or licensed to HyperTest and are protected by applicable patent, copyright and other intellectual property laws and international conventions and treaties. All rights not expressly granted to you hereunder are reserved by HyperTest and its licensors. The Terms do not convey to you an interest in or to the HyperTest’s Intellectual Property but only a limited revocable right of use in accordance with the Terms. Nothing in the Terms constitutes a waiver of HyperTest’s Intellectual Property under any law. To the extent you provide any feedbacks, comments or suggestions to HyperTest (“Feedback”), HyperTest shall have an exclusive, royalty-free, fully paid up, worldwide, perpetual and irrevocable license to incorporate the Feedback into any HyperTest current or future products, technologies or services and use same for any purpose all without further compensation to you and without your approval. You agree that all such Feedback shall be deemed to be non-confidential. Further, you warrant that your Feedback is not subject to any license terms that would purport to require HyperTest to comply with any additional obligations with respect to any HyperTest current or future products, technologies or services that incorporate any Feedback. 11. Trademarks and Trade names HyperTest’s marks and logos and all other proprietary identifiers used by HyperTest in connection with the Site (“HyperTest’s Trademarks”) are all trademarks and/or trade names of HyperTest, whether or not registered. All other trademarks, service marks, trade names and logos which may appear on the Site belong to their respective owners (“Third Party Marks”). No right, license, or interest to HyperTest’s Trademarks and the Third Party Marks is granted hereunder, and you agree that no such right, license, or interest may be asserted by you with respect thereto and therefore you will avoid using any of those marks, except as permitted herein. 12. Linking to HyperTest's Site and links to Third Party Sites We welcome links to any page on our Site. You are free to establish a hypertext link to the Site so long as the link does not state or imply any connection or approval of your website, products and/or services by HyperTest and does not portray HyperTest in a false or otherwise offensive manner. You may not link to our Site from a site that you do not own or have permission to use. In the event that you link to HyperTest’s Site you represent that your site does not contain content that is unlawful, offensive or infringing third party rights. However, we do not permit framing or inline linking. Certain links provided herein permit our Users to leave this Site and enter non-HyperTest sites or services. Those linked sites and services are provided solely as a convenience to you. These linked sites and services are not under the control of HyperTest and it is not responsible for the availability of such external sites or services, and does not endorse and is not responsible or liable for any content including but not limited to content advertising, products or other information on or available from such linked sites and services or any link contained in linked sites or service. In addition, HyperTest is not responsible or liable for such linked sites and services’ privacy practices and/or any other practices. Your access to, use of and reliance upon any such sites, services and content and your dealings with such third parties are at your sole risk and expense. HyperTest reserves the right to terminate any link at any time. You further acknowledge and agree that HyperTest shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused, by or in connection with use of or reliance on any services, content, products or other materials available on or through such linked sites or resource. Most of such linked sites and services provide legal documents, including terms of use and privacy policy, governing the use thereof. It is always advisable, and we encourage you to read such documents carefully before using those sites and services, inter alia, in order to know what kind of information about you is being collected. 13. Availability The Site’s availability and functionality depends on various factors, such as communication networks. HyperTest does not warrant or guarantee that the Site will operate and/or be available at all times without disruption or interruption, or that it will be immune from unauthorised access or error-free. 14. Changes to The Site HyperTest reserves the right to modify, correct, amend, enhance, improve, make any other changes to, or discontinue, temporarily or permanently this Site (or any part thereof, including but not limited to the Content) without notice, at any time. In addition, you hereby acknowledge that the Content provided under this Site may be changed, extended in terms of content and form or removed at any time without any notice to you. You agree that HyperTest shall not be liable to you or to any third party for any modification, suspension, or discontinuance of this Site or the Content included therein. You hereby agree that HyperTest is not responsible for any errors or malfunctions that may occur in connection with the performance of such changes. 15. Disclaimers and No Warranties TO THE FULLEST EXTENT LEGALLY PERMISSIBLE, THE SITE AND CONTENT ARE PROVIDED ON AN “AS IS”, “WITH ALL FAULTS” AND “AS AVAILABLE” BASIS, AND HyperTest, INCLUDING ITS VENDORS, OFFICERS, SHAREHOLDERS, SUB-CONTRACTORS, DIRECTORS, EMPLOYEES, AFFILIATES, SUBSIDIARIES, LICENSORS, AGENTS AND SUPPLIERS (COLLECTIVELY, “HyperTest’S REPRESENTATIVES“), DISCLAIM ALL WARRANTIES OF ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF TITLE OR NON-INFRINGEMENT OR IMPLIED WARRANTIES OF USE, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE AND THOSE ARISING FROM A COURSE OF DEALING OR USAGE OF TRADE. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS THAT THIS AGREEMENT CANNOT CHANGE. WE NOTE THAT THESE TERMS GOVERN SOLELY THE USE OF THE SITE. ALL DISCLAIMERS AND WARRANTIES REGARDING ANY SERVICES OF HyperTest SHALL BE GOVERNED BY THE TERMS AND CONDITIONS REFLECTED IN A SEPARATE SERVICES AGREEMENT BETWEEN HyperTest AND EACH USER. WE DO NOT WARRANT (I) THAT THE USE AND OPERATION OF THE SITE AND/OR THE CONTENT IS OR WILL BE SECURE, TIMELY, ACCURATE, COMPLETE, UNINTERRUPTED, WITHOUT ERRORS, OR FREE OF VIRUSES, DEFECTS, WORMS, OTHER HARMFUL COMPONENTS OR OTHER PROGRAM LIMITATIONS, (II) THAT WE WILL CORRECT ANY ERRORS OR DEFECTS IN THE SITE, (III) AND/OR MAKE ANY REPRESENTATION REGARDING THE USE, INABILITY TO USE OR OPERATE, OR THE RESULTS OF THE USE OF THE SITE AND/OR CONTENT AVAILABLE THEREON OR THROUGH THE SITE (INCLUDING THAT THE RESULTS OF USING THE SITE WILL MEET YOUR REQUIREMENTS). HYPERTEST AND HYPERTEST’S REPRESENTATIVES DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THE USE OF THE SITE, INCLUDING BUT NOT LIMITED TO THE AVAILABILITY, RELIABILITY OR THE QUALITY OF THE SITE, AND ARE NOT AND SHALL NOT BE RESPONSIBLE FOR ANY ERROR, FAULT OR MISTAKE RELATED TO ANY CONTENT AND/OR INFORMATION DISPLAYED WITHIN THE SITE. WE ARE NOT RESPONSIBLE FOR ANY CONSEQUENCES TO YOU OR OTHERS THAT MAY RESULT FROM TECHNICAL PROBLEMS (INCLUDING WITHOUT LIMITATION IN CONNECTION WITH THE INTERNET SUCH AS SLOW CONNECTIONS, TRAFFIC CONGESTION, OVERLOAD OF SERVERS, DELAYS OR INTERRUPTIONS) OR ANY TELECOMMUNICATIONS OR INTERNET PROVIDERS. YOU AGREE THAT USE OF THE SITE AND/OR THE CONTENT THEREIN IS ENTIRELY AT YOUR OWN RISK. INASMUCH AS SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSIONS OR LIMITATIONS AS SET FORTH HEREIN, THE FULL EXTENT OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY. 16. Limitation of Liability TO THE MAXIMUM EXTENT LEGALLY PERMISSIBLE, IN NO EVENT SHALL HYPERTEST, INCLUDING HYPERTEST’S REPRESENTATIVES BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING, BUT NOT LIMITED TO, DIRECT, INDIRECT, SPECIAL, PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND, UNDER ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, CONTRACT, NEGLIGENCE, TORT OR STRICT LIABILITY), INCLUDING, WITHOUT LIMITATION, LOSS OF GOODWILL, PROFITS OR DATA AND BUSINESS INTERRUPTION, ARISING HEREUNDER, RESULTING FROM OR ARISING OUT OF THE SITE, ANY COMMUNICATIONS AND INTERACTIONS OR MEETINGS WITH USERS OF THE SITE OR OTHER PERSONS WITH WHOM YOU COMMUNICATE AS A RESULT OF YOUR USE OF THE SITE, AND/OR THE CONTENT, YOUR USE OR INABILITY TO USE THE SITE AND/OR THE CONTENT AND/OR THE FAILURE OF THE SITE TO PERFORM AS REPRESENTED OR EXPECTED, OR FROM ANY CONTENT, OR FROM THE PERFORMANCE OR FAILURE OF HYPERTEST TO PERFORM UNDER THESE TERMS, ANY OTHER ACT OR OMISSION OF HYPERTEST OR HYPERTEST’S REPRESENTATIVES BY ANY OTHER CAUSE WHATSOEVER; OR BASED UPON BREACH OF WARRANTY, GUARANTEE OR CONDITION, BREACH OF CONTRACT, NEGLIGENCE, STRICT LIABILITY, TORT, OR ANY OTHER LEGAL THEORY, REGARDLESS OF WHETHER HYPERTEST OR HYPERTEST’S REPRESENTATIVES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY CASE, WITHOUT LIMITING THE GENERALITY OF THE FOREGOING AND TO THE MAXIMUM EXTENT LEGALLY PERMISSIBLE, HYPERTEST’S AND HYPERTEST’S REPRESENTATIVES’ TOTAL AGGREGATE LIABILITY FOR ALL DAMAGES OR LOSSES WHATSOEVER ARISING HEREUNDER OR IN CONNECTION WITH YOUR USE OR INABILITY TO USE THE SITE AND/OR THE CONTENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU, IF ANY, TO HYPERTEST FOR USE OF THE SITE OR $US1.00, WHICHEVER IS GREATER. YOU WILL NOT, AND WAIVE ANY RIGHT TO, SEEK TO RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES FROM US AND FROM HYPERTEST’S REPRESENTATIVES. INASMUCH AS SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSIONS OR LIMITATIONS AS SET FORTH HEREIN, THE FULL EXTENT OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY. 17. Indemnification You agree to defend, indemnify and hold harmless HyperTest, including HyperTest Representatives from and against any and all claims, damages, obligations, losses, liabilities, costs, debts, and expenses (including but not limited to attorney’s fees) arising from: (i) your use, misuse of, inability to use and/or activities in connection with the Site and/or Content; (ii) your violation of any of these Terms; (iii) your violation of any third party rights, including without limitation any intellectual property rights or privacy right of such third party, in connection with your use of the Site; and (iv) any damage of any sort, whether direct, indirect, special or consequential, you may cause to any third party with relation to the Site. It is hereby clarified that this defense and indemnification obligation will survive these Terms. Without derogating from the foregoing, we reserve the right to assume the exclusive defense and control of any matter which is subject to indemnification by you, which will not excuse your indemnity obligations hereunder and in which event you will fully cooperate with us in asserting any available defense. You agree not to settle any matter subject to an indemnification by you without first obtaining our prior express written approval. 18. Amendments to the Terms HyperTest may, at its sole discretion, change the Terms from time to time, including any other policies incorporated thereto, so please re-visit this page frequently. In case of any material change, we will make reasonable efforts to post a clear notice on the Site and/or will send you an e-mail (to the extent that you provided us with such e-mail address) regarding such change. Such material changes will take effect seven (7) days after such notice was provided on our Site or sent via e-mail, whichever is the earlier. Otherwise, all other changes to these Terms are effective as of the stated “Last Revised” date and your continued use of the Site on or after the Last Revised date will constitute acceptance of, and agreement to be bound by, those changes. In the event that the Terms should be amended to comply with any legal requirements, the amendments may take effect immediately, or as required by the law and without any prior notice. 19. Termination of these Terms and the Termination of the Site's operation At any time, HyperTest may without notice discontinue your use of the Site, at its sole discretion, in addition to any other remedies that may be available to HyperTest under any applicable law. Additionally, HyperTest may at any time, at its sole discretion, cease the operation of the Site or any part thereof, temporarily or permanently, delete any information or Content from the Site or correct, modify, amend, enhance, improve and make any other changes thereto or discontinue displaying or providing any information, Content or features therein without giving any prior notice. You agree and acknowledge that HyperTest does not assume any responsibility with respect to, or in connection with the termination of the Site’s operation and loss of any data. The provisions of these Terms that, by their nature and content, must survive the termination of these Terms in order to achieve the fundamental purposes of these Terms shall so survive. Without limiting the generality of the forgoing, the Intellectual Property, Disclaimer and Warranties, Limitation of Liability, Indemnification and General sections will survive the termination of the Terms. 20. General (a) These Terms constitute the entire terms and conditions between you and HyperTest relating to the subject matter herein and supersedes any and all prior written or oral agreements or understandings between you and HyperTest, (b) any claim relating to the Site or the use thereof will be governed by and interpreted in accordance with the laws of the State of California and the federal U.S. laws applicable therein without reference to its conflict-of-laws principles and the United Nations Convention Relating to a Uniform Law on the International Sale of Goods may not be applied, (c) any dispute arising out of or related to the Site will be brought in, and you hereby consent to exclusive jurisdiction and venue in, the competent courts located in Santa Clara County, California. You agree to waive all defenses of lack of personal jurisdiction and forum non-convenience and agree that process may be served in a manner authorized by applicable law or court rule. Notwithstanding the foregoing, HyperTest may seek injunctive relief in any court of competent jurisdiction, (d) these Terms do not, and shall not be construed to create any relationship, partnership, joint venture, employer-employee, agency, or franchisor-franchisee relationship between the parties hereto, (e) no waiver by either party of any breach or default hereunder will be deemed to be a waiver of any preceding or subsequent breach or default. Any heading, caption or section title contained herein is inserted only as a matter of convenience, and in no way defines or explains any section or provision hereof, (f) YOU ACKNOWLEDGE AND AGREE THAT ANY CAUSE OF ACTION THAT YOU MAY HAVE ARISING OUT OF OR RELATED TO THE SITE MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES. OTHERWISE, SUCH CAUSE OF ACTION IS PERMANENTLY BARRED, (g) if any provision hereof is adjudged by any court of competent jurisdiction to be unenforceable, that provision shall be limited or eliminated to the minimum extent necessary so that these Terms shall otherwise remain in full force and effect while most nearly adhering to the intent expressed herein, (h) you may not assign or transfer these Terms (including all rights and obligations hereunder) without our prior written consent and any attempt to do so in violation of the foregoing shall be void. We may assign or transfer these Terms without restriction or notification, (i) no amendment hereof will be binding unless in writing and signed by HyperTest, and (j) the parties agree that all correspondence relating to these Terms shall be written in the English language. 21. For information, questions or notification of errors, please contact: If you have any questions (or comments) concerning the Terms, you are most welcome to send us an e-mail to connect@hypertest.co
- How to generate mocks for your test without needing mockito?
Ditch Mockito! Craft mocks directly in your tests for faster, cleaner unit testing. 07 Min. Read 26 April 2024 How to generate mocks for your test without needing mockito? Shailendra Singh WhatsApp LinkedIn X (Twitter) Copy link 📖 Scope of mocking in unit tests When writing unit tests for code that interacts with external dependencies (like APIs, databases, file systems, or other external services), a developer needs to ensure these dependencies are properly isolated to make tests predictable, fast, and reliable. The key strategies involve mocking, stubbing, and using test doubles (mocks, stubs, and fakes). Developers achieve this using any of the many mocking frameworks out there (mockito for example), but HyperTest can auto-generate such mocks or stubs without needing any manual intervention or set-up. This solves a lot of problems: 1.Saves time : Developers valuable time is freed up from writing and maintaining mocks and stubs 2. Maintenance of mocks : Hand-written mocks and stubs become stale i.e. the behavior of the systems mocked can change that requires rewriting these artefacts. On the contrary, HyperTest generated mocks are updated automatically keeping them always in sync with the current behaviour of dependencies 3. Incorrect Mocking : When stubbed or mocked using frameworks, developers rely at best on their understanding of how external systems respond. Incorrect stubbing would mean testing against an unreal behavior and leaking errors. HyperTest on the other hand builds stubs and mocks based on real interactions between components. This not only ensures they are created with the right contracts but are also updated when behaviours of dependencies change keeping mocks accurate and up-to-date So let’s discuss all the different cases where developers would need mocks, how they build them using a framework like mockito and how HyperTest will automate mocking, removing the need to use mockito 1️⃣ Mocking External Services: Downstream calls, 3rd party APIs Mocking involves creating objects that simulate the behavior of real services. A mock object will return predefined responses to function calls during tests. This is particularly useful for external APIs or any service that returns dynamic data. Example: Suppose a developer of a service named AccountService in a bank is dependent on the TransactionService to fetch updates on account balances when a user performs credit or debit transaction on his account. The TransactionAPI would look something like this: curl -X POST 'https://api.yourbank.com/transactions/updateBalance' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {access_token}' \ -d '{ "customerId": 3, "transactionAmount": 500 }' The AccountService has a class AccountService which the developer needs to test without actually needing to call the API. To do so he decides to use mockito and would do the following: Mock Creation : Mock the TransactionAPI using mock(TransactionAPI.class) . Method Stubbing : The updateBalance method of the mock is configured to return a new BalanceUpdateResponse with the specified old and new balances when called with specific arguments. Service Testing : The AccountService is tested to ensure it properly delegates to TransactionAPI and returns the expected result. Assertions and Verifications : After calling performTransaction , assertions are used to check that the returned balances are correct, and verify is used to ensure that TransactionAPI.updateBalance was called with the correct parameters. This is how his mockito implementation will look like: import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; public class AccountServiceTest { @Test public void testPerformTransaction() { // Create a mock TransactionAPI TransactionAPI mockTransactionAPI = mock(TransactionAPI.class); // Setup the mock to return a specific response when(mockTransactionAPI.updateBalance(3, 500)) .thenReturn(new BalanceUpdateResponse(10000, 10500)); // Create an instance of AccountService with the mocked API AccountService accountService = new AccountService(mockTransactionAPI); // Perform the transaction BalanceUpdateResponse response = accountService.performTransaction(3, 500); // Assert the responses assertEquals(10000, response.getOldBalance()); assertEquals(10500, response.getNewBalance()); // Verify that the mock was called with the correct parameters verify(mockTransactionAPI).updateBalance(3, 500); } } Mocking external services without needing Mockito HyperTest eliminates all this effort in a jiffy! Service to service interactions called contracts are automatically built by HyperTest by monitoring actual interactions, in this case between the AccountService and TransactionService . How this happens? The HyperTest SDK is set-up on the AccountService and TransactionService It monitors all the incoming and outgoing calls for both AccountService and TransactionService. In this case, the request - response pair i.e. the contract between AccountService - TransactionService is captured by HyperTest. This contract is used as to mock the TransactionService when testing AccountService and vice versa. Now when the developer wants to test his AccountService class in Accounts Service , HyperTest CLI builds AccountService app locally or at the CI server and calls this request, and supplies the mocked response from TransactionService HyperTest SDK that tests TransactionService and AccountService separately, automatically asserts 2 things: The TransactionAP I was called with the correct parameters by the AccountService Response of the TransactionService , i.e. new balance is same as 10500 or not. If not it reports error like this. 🚨 TAKEAWAY: HyperTest mocks upstream and downstream calls automatically, somethings that 20 lines of mockito code did above. Best thing, it refreshes these mocks as the behavior of the AccountService (requests) or TransactionService (response) change 2️⃣ Database Mocking: Stubbing for Database Interactions Stubbing is similar to mocking but is typically focused on simulating responses to method calls. This is especially useful for database interactions where you can stub repository or DAO methods. Example: Now developer of the TransactionService wants to mock the database layer, for which he creates stubs using Mockito. This service retrieves and updates the account balance from the database. The db interface would like this: public interface AccountRepository { int getBalance(int customerId); void updateBalance(int customerId, int newBalance); } TransactionService public class TransactionService { private AccountRepository accountRepository; public TransactionService(AccountRepository accountRepository) { this.accountRepository = accountRepository; } public BalanceUpdateResponse performTransaction(int customerId, int transactionAmount) { int oldBalance = accountRepository.getBalance(customerId); int newBalance = oldBalance + transactionAmount; accountRepository.updateBalance(customerId, newBalance); return new BalanceUpdateResponse(oldBalance, newBalance); } } Unit test with Mockito Mock the database layer AccountRepository Create instance of TransactionService with mocked repository Perform the Transaction Assert the response import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.assertEquals; public class TransactionServiceTest { @Test public void testPerformTransaction() { // Mock the AccountRepository AccountRepository mockRepository = mock(AccountRepository.class); // Setup stubs for the repository methods when(mockRepository.getBalance(3)).thenReturn(10000); doNothing().when(mockRepository).updateBalance(3, 10500); // Create an instance of TransactionService with the mocked repository TransactionService service = new TransactionService(mockRepository); // Perform the transaction BalanceUpdateResponse response = service.performTransaction(3, 500); // Assert the responses assertEquals(10000, response.getOldBalance()); assertEquals(10500, response.getNewBalance()); // Verify that the repository methods were called correctly verify(mockRepository).getBalance(3); verify(mockRepository).updateBalance(3, 10500); } } Mocking the database layer without needing Mockito HyperTest SDK, that sits on the TransactionService , can mock the database layer automatically without needing to stub db response like explained above with mockito. The SDK performs the same way for database interactions as it did intercepting outbound http (GraphQL / gRPC) call for external services. In this example, the TransactionService asks the database 2 things: Query 1 : For a given customerId , return the oldBalance or current balance Query 2 : Update the oldBalance to newBalance for the same customerId HyperTest mocks both these operations for the TransactionService , like shown below: The outputs are captured as mocks as the SDK looks at the actual query from the traffic. This is then used when TransactionService is tested. This is what HyperTest does: Perform the transaction i.e. replays the request but use the captured output as the mock Compare the response and database query in the RECORD and REPLAY stage and assert newBalance across both the service response and db query 🚨 TAKEAWAY: HyperTest mocks the database layer just like external services, again that 25 lines of mockito code did above. This removes the need to stub db responses 3️⃣ Testing message queues or event streams Mocking a message queue or event stream is particularly useful in scenarios where you need to test the interaction of your code with messaging systems like RabbitMQ, Kafka, or AWS SQS without actually sending or receiving messages from the real system Example : Let's say you have a class MessagePublisher that sends messages to a RabbitMQ queue. You can mock this interaction to verify that messages are sent correctly without needing a running RabbitMQ instance. Java Class to Test: javaCopy code public class MessagePublisher { private final Channel channel; public MessagePublisher(Channel channel) { this.channel = channel; } public void publishMessage(String queueName, String message) throws IOException { channel.basicPublish("", queueName, null, message.getBytes()); } } This MessagePublisher class uses an instance of Channel from the RabbitMQ client library to publish messages. Unit Test with Mockito: javaCopy code import com.rabbitmq.client.Channel; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; public class MessagePublisherTest { @Test public void testPublishMessage() throws IOException { // Create a mock Channel Channel mockChannel = Mockito.mock(Channel.class); // Create an instance of the class under test, passing the mock Channel MessagePublisher publisher = new MessagePublisher(mockChannel); // Define the queue name and the message to be sent String queueName = "testQueue"; String message = "Hello, world!"; // Execute the publishMessage method, which we are testing assertDoesNotThrow(() -> publisher.publishMessage(queueName, message)); // Verify that the channel's basicPublish method was called with the correct parameters Mockito.verify(mockChannel).basicPublish("", queueName, null, message.getBytes()); } } Explanation: Mock Creation : The Channel class is mocked. This is the class provided by the RabbitMQ client library for interacting with the queue. Method Testing : The publishMessage method of the MessagePublisher class is tested to ensure it calls the basicPublish method on the Channel object with the correct parameters. Verification : The test verifies that basicPublish was called exactly once with the specified arguments. This ensures that the message is formatted and sent as expected. Mocking Queue Producers & Consumers without needing Mockito HyperTest use the same technique to capture interactions between a queue producer and consumer. This gives it the ability to verify if producer is sending the right messages to the broker, and if the consumer is doing the right operations after receiving those messages. When testing producers, HyperTest will assert for: Schema : The data structure of the message i.e. string, number etc Data : The exact values of the message parameters Here is the example of how HyperTest has mocked the broker for the producer by capturing the outbound calls (expected downstream call) and asserting the outbound messages by comparing the actual message (real downstream call) with one captured message. The same way the HyperTest SDK on the respective consumer would test all side effects by asserting consumer operations 🚨 TAKEAWAY: HyperTest mocks the broker for both the queue producer and consumer in an actual end to end event flow. It can then test the producer and consumer separately. This automates mocking and testing an async event flow without the need of mocking frameworks like mockito or others. Prevent Logical bugs in your databases calls, queues and external APIs or services Take a Live Tour Book a Demo
- Bug-free Bytes Newsletter | Tech Verse
June 2024 Edition: Why E2E Fails, Message Queues Testing Guide, Upcoming Events & More for Engineering Leaders Hey there! 👋 Remember those awesome engineering books we recommended? We hope you enjoyed them! Speaking of awesome, Bug-Free Bytes Vol. 6 is here already! Get ready to dive in. a. End-to-End Message Queue Testing for a Better Delivery Kafka, RabbitMQ, and Amazon SQS are popular choices, but pinpointing the culprit – the queue, producer, or consumer – becomes a frustrating guessing game when issues arise. This whitepaper's smart testing techniques get clear insights into how your A, B, C (and beyond!) services communicate. Access the whitepaper here! b. This Month's Community Picks: 👉 Login to smooth sailing, or log out in frustration? Unveiling the truth about End-to-End testing – is it your software's heaven or heck? Learn more 👉 Wondering why your website's slower than a dial-up connection? HTTP2 might just be your solution to achieve speed. Learn more 👉 Imagine catching bugs before they cause problems - that's developer confidence at its finest! Discover more about this proactive practice here. Learn more c. Upcoming Events: 🧭 Dive into the Future of Web: Browser Conference 2024 (Online): Browser Conference is a leading event dedicated to exploring the latest advancements and innovations shaping the future of the web. 🧭 Actionable insights on Generative AI, security, modern web apps, and more (Online): Get clarity from senior software practitioners on today's critical dev priorities with two days of technical talks and peer connections. 🧭 It’s ChatGPT time again (28 June, Munich/ Online): This session at the Machine Learning Technologies & Innovations Conference (ML-Con) will offer an in-depth exploration of ChatGPT, a powerful AI tool beloved by many. Please share your feedback; your input helps us keep making it even better. 🎉 Cheers, Team HyperTest 💙