Rayrun
← Back to QA Wiki

Definition of Functional Integration

Functional Integration relates products and services to an ecosystem to attract and retain customers.

Related Terms:

Thank you!
Was this helpful?

Questions about Functional Integration?

Basics and Importance

  • What is functional integration in software testing?

    Functional integration in software testing is the process of combining and testing related functional units together to ensure they operate correctly as a group. It focuses on the interactions and data flow between integrated functions, verifying that combined functionalities meet specified requirements.

    Functional integration is a critical step that precedes system testing and is often conducted after unit testing. It serves to detect interface defects and ensure that functional units collaborate as intended within the system. This integration level is particularly significant in complex systems where functions are heavily interdependent.

    Testing is typically executed using black-box or gray-box techniques, where the internal workings of the application are not the primary concern, but rather the behavior of the integrated functions. Test cases are designed based on the functional specifications and the interactions between the units.

    Automation plays a crucial role in functional integration by enabling repetitive and consistent test execution. Automated tests can be integrated into a continuous integration (CI) pipeline, allowing for early detection of integration issues.

    To effectively implement functional integration testing, engineers should:

    • Identify critical integration points and data paths.
    • Design test cases that reflect realistic scenarios and use cases.
    • Utilize mocks and stubs to isolate the integrated functions from external dependencies.
    • Integrate automated tests into the CI process for continuous feedback.
    • Monitor test results and address issues promptly to maintain system stability.

    Functional integration testing is essential for validating that different parts of the application work together seamlessly, thus contributing to the delivery of a robust and reliable software product.

  • Why is functional integration important in software development?

    Functional integration is crucial in software development as it ensures that individual functions or services work together as expected when combined. It validates that the integrated components interact correctly, providing a seamless operation within the larger system. This integration is essential for identifying interface defects and verifying that the system meets its functional requirements when modules are combined.

    By conducting functional integration testing, teams can detect issues early in the development cycle, reducing the cost and effort of fixing bugs found later in production. It also supports the verification of new features or changes in an iterative development process, allowing for continuous improvement and delivery.

    Moreover, functional integration serves as a bridge between unit testing, which focuses on individual components, and system testing, which evaluates the complete and integrated software product. It helps maintain the integrity of the software as new functionalities are merged, ensuring that enhancements do not break existing features.

    In the context of Continuous Delivery and DevOps, functional integration is integral to the deployment pipeline, enabling automated testing of the integrated system at each stage of development. This automation facilitates rapid feedback loops, allowing developers to address issues promptly and maintain a high standard of software quality.

    Overall, functional integration is a fundamental practice that supports the creation of robust, reliable software by ensuring that all parts of the system work together harmoniously, delivering the intended user experience and business value.

  • What are the key components of functional integration?

    Key components of functional integration in software test automation include:

    • Test Harness: A system that sets up a test environment, runs the tests, and reports outcomes.
    • Stubs and Drivers: Code modules that simulate the behavior of missing components during testing.
    • Test Data: Sets of inputs that the system will use during testing to mimic real-world scenarios.
    • Test Scripts: Automated sequences that execute test cases, interact with the application, and log results.
    • Integration Points: Specific areas where modules or services connect and interact, requiring thorough testing.
    • Version Control: Systems like Git to manage code changes, ensuring that integration tests are up-to-date with the latest application version.
    • Continuous Integration (CI) Server: Automates the build, deploy, and test cycles, often triggering functional integration tests after each commit.
    • Test Environment: A replica of the production environment where the integration tests are executed.
    • Mock Objects: Simulated objects that mimic the behavior of real components for testing purposes.
    • Test Coverage Tools: Tools that measure the extent to which the test cases cover the codebase and functionalities.
    • Defect Tracking System: A tool for reporting, tracking, and managing bugs found during testing.
    • Reporting Tools: Generate detailed reports on test execution, outcomes, and metrics for analysis.

    These components work together to ensure that functional integration tests are comprehensive, repeatable, and maintainable, leading to reliable integration of software modules.

  • How does functional integration differ from other types of integration testing?

    Functional integration testing focuses on the correctness of specific functionalities when integrated, whereas other integration testing types may target system cohesiveness from different perspectives. For instance, system integration testing (SIT) evaluates the interactions between different systems or subsystems, ensuring they work together as expected. Component integration testing (CIT) looks at the interactions between individual components within a system, verifying that they function together correctly at a lower level than functional integration.

    In contrast, interface integration testing examines the points of interaction between integrated units, such as APIs or user interfaces, to ensure they communicate correctly. Continuous integration testing is a practice rather than a type, involving automated tests run during the development process to check the integration of new code into the existing codebase.

    Functional integration differs by specifically validating the business requirements when modules or services are combined, rather than focusing on the technical or structural aspects of integration. It ensures that the integrated functionalities meet the defined use cases and provide the expected outcome for the user.

    To summarize, while other integration tests may focus on structural, system-wide, component-level, or continuous integration aspects, functional integration testing is dedicated to verifying that the integrated functions deliver the correct business value and user experience.

  • What is the role of functional integration in end-to-end testing?

    Functional integration plays a crucial role in end-to-end (E2E) testing by ensuring that various system components work together to achieve the desired functionality from start to finish. It verifies that integrated units perform as designed when they are combined, which is essential before conducting E2E tests that simulate real-world scenarios.

    In E2E testing, functional integration acts as a precursor, setting the stage for a comprehensive assessment of the system's external interfaces and overall behavior. It confirms that data flows correctly between integrated units and that the system meets functional requirements when operating in unison.

    By validating functional integration before E2E testing, you minimize the risk of encountering fundamental issues during the more complex and resource-intensive E2E tests. This approach helps in isolating and pinpointing defects related to interactions between integrated units, rather than discovering them later during E2E testing, which can be more challenging to debug.

    Moreover, functional integration within E2E testing ensures that any changes or additions to the system do not break existing functionalities. It provides a safety net for continuous integration environments, where new code is frequently merged and needs to be verified for compatibility and functionality.

    In summary, functional integration is a vital step in the E2E testing process, bridging unit testing and E2E testing by confirming that all parts of the system work together as intended, thus paving the way for successful and efficient E2E testing.

Techniques and Strategies

  • What are the common techniques used in functional integration testing?

    Common techniques used in functional integration testing include:

    • Stubbing and Mocking: Replace dependent components with stubs or mocks to simulate interactions and test the integration points without the need for the actual components to be available.

    • Test Harness: Create a test harness that can drive the application's interfaces to test the integration between components.

    • Service Virtualization: Use service virtualization tools to mimic the behavior of components that are not yet developed or are unavailable for testing.

    • API Testing: Perform API testing to ensure that the interfaces between components work as expected, including RESTful services, SOAP web services, and other API protocols.

    • Data-Driven Testing: Utilize data-driven approaches to test how different data sets affect the integration between components.

    • Contract Testing: Ensure that the interaction between integrated components adheres to a defined contract, which can be useful in microservices architectures.

    • End-to-End Testing Scenarios: Incorporate functional integration tests within broader end-to-end testing scenarios to validate the integrated components within the context of the entire system.

    • Continuous Integration Pipelines: Integrate functional integration tests into CI pipelines to run tests automatically whenever changes are made, ensuring continuous validation of component integration.

    • Performance Testing: Include performance testing to evaluate the impact of integration on the system's performance, particularly when integrating with external services or databases.

    • Error Handling and Recovery Testing: Test how the system handles errors at integration points, including network failures, incorrect data, and unexpected behavior of integrated components.

    • Regression Testing: Regularly run regression tests to ensure that new changes do not break existing integrations.

    These techniques help ensure that integrated components work together seamlessly and meet functional requirements.

  • How do you plan and strategize functional integration tests?

    To plan and strategize functional integration tests, begin by identifying critical integration points between system components. Review the architecture diagrams and interface contracts to understand how modules interact. Next, prioritize test scenarios based on risk and importance to business functionality.

    Develop a test plan that outlines the scope, objectives, and schedule for testing activities. Ensure that the plan includes test data management strategies for creating realistic scenarios. Use version control to manage test scripts and maintain a single source of truth.

    Incorporate test stubs and drivers to simulate components that are not yet available or are outside the control of the test environment. This allows for testing of interactions without the need for complete system availability.

    Leverage automation frameworks that support integration testing, such as Selenium for web applications or Appium for mobile apps. Write modular and reusable test scripts to facilitate maintenance and scalability.

    Implement continuous integration (CI) practices to automatically trigger functional integration tests upon code commits. This ensures immediate feedback on the impact of changes.

    Utilize test reporting tools to generate actionable insights. Reports should highlight pass/fail status, defects, and coverage metrics. Analyze results to identify patterns and recurrent issues.

    Finally, conduct regular reviews of the testing strategy to adapt to changes in the system and incorporate lessons learned from previous test cycles. This iterative approach ensures that the testing strategy remains effective and aligned with project goals.

  • What are the best practices for functional integration testing?

    Best practices for functional integration testing include:

    • Prioritize test cases based on critical business functions and risk assessment to ensure that the most important areas are covered first.
    • Create reusable test cases to save time and maintain consistency across different integration points.
    • Use data-driven testing to validate the integration with various sets of input data, enhancing test coverage and reliability.
    • Mock external services when necessary to isolate the system under test and avoid dependencies that can cause flakiness.
    • Automate regression tests to quickly verify that new changes haven't broken existing functionality.
    • Implement continuous testing within the CI/CD pipeline to detect issues early and often.
    • Monitor test environment stability to ensure that environmental issues do not skew test results.
    • Validate both positive and negative scenarios to ensure the system handles errors gracefully.
    • Collaborate with developers to understand integration points and ensure that tests are aligned with the system's design.
    • Maintain clear documentation for test cases and results to facilitate communication and future test maintenance.
    • Review and refine tests regularly to adapt to changes in the system and remove obsolete or redundant tests.

    By following these practices, you can ensure that functional integration testing is efficient, effective, and contributes to the overall quality and reliability of the software product.

  • How do you manage dependencies in functional integration testing?

    Managing dependencies in functional integration testing involves ensuring that all the necessary components of the application are available and interact correctly to support the test scenarios. Here are some strategies:

    • Use Mocks and Stubs: Replace external systems or services that are not available or are unreliable with mocks and stubs to simulate their behavior.

    • Test Doubles: Utilize test doubles for components that have not been developed yet or are unstable.

    • Version Control: Keep track of the versions of external services and components to ensure compatibility.

    • Containerization: Use containers (e.g., Docker) to encapsulate dependencies, making it easier to manage and deploy them consistently across environments.

    • Service Virtualization: Virtualize services to mimic the behavior of dependent systems that are not easily accessible during testing.

    • Dependency Management Tools: Utilize tools like Maven, Gradle, or npm to manage library dependencies, ensuring that the correct versions are used during testing.

    • Continuous Integration: Integrate early and often, using CI tools to automate the deployment of dependencies and the execution of integration tests.

    • Environment Management: Maintain separate testing environments that mirror production as closely as possible, with all dependencies correctly configured.

    • Configuration Management: Use configuration management tools to automate the setup and maintenance of dependencies in your test environments.

    • Order of Test Execution: Design the test execution order to ensure that tests with fewer dependencies run first, gradually moving towards tests with more complex dependencies.

    By carefully managing dependencies, you can minimize the risk of integration issues and ensure that functional integration tests yield reliable and meaningful results.

  • What are the challenges in functional integration testing and how to overcome them?

    Functional integration testing faces several challenges, including environmental discrepancies, data management, and service dependencies. Overcoming these requires a combination of automation strategies, test data management (TDM) solutions, and service virtualization.

    Environmental Discrepancies: Differences between test environments and production can lead to false test results. Use containerization and infrastructure as code (IaC) to mirror production environments closely.

    Data Management: Ensuring relevant and consistent test data is available can be difficult. Implement TDM practices to maintain data integrity and relevance. Utilize tools that can generate, mask, and manage test data effectively.

    Service Dependencies: Testing integrated components often depends on external services that may be unstable or unavailable. Apply service virtualization to simulate these services, allowing for testing without the need for the actual services to be up and running.

    Flakiness: Tests can be flaky due to timing issues or intermittent service responses. Address this by implementing retries with exponential backoff and by using synchronization mechanisms to wait for conditions to be met before proceeding.

    Complex Scenarios: Complex test scenarios can be challenging to automate. Break down tests into smaller, manageable pieces and use BDD frameworks to describe scenarios in a human-readable format.

    Continuous Integration: Integrate functional integration tests into a CI/CD pipeline to ensure they are run regularly and issues are detected early. Use tools that support parallel execution to reduce feedback time.

    Monitoring and Reporting: Implement comprehensive logging and reporting to quickly identify and address failures. Use dashboards to visualize test results and trends over time.

    By addressing these challenges with the right tools and methodologies, you can ensure that functional integration testing is efficient, reliable, and adds value to the development process.

Tools and Technologies

  • What tools are commonly used for functional integration testing?

    Common tools for functional integration testing include:

    • Selenium: An open-source framework for web applications that supports multiple languages and browsers.
    • Postman: A tool for API testing that allows users to send HTTP requests and analyze responses.
    • SoapUI: Specialized in SOAP and REST API testing, providing a comprehensive suite for service-oriented architectures.
    • JMeter: An Apache project used for performance testing, which can also be configured for functional testing.
    • TestComplete: A commercial tool that offers a GUI for creating automated tests for desktop, mobile, and web applications.
    • Cucumber: Supports behavior-driven development (BDD) with plain language specifications, often used in conjunction with Selenium.
    • SpecFlow: A .NET BDD framework similar to Cucumber, integrating with Visual Studio.
    • HP UFT (formerly QTP): A commercial tool for functional and regression testing with a visual test editor.
    • Ranorex: Provides tools for desktop, web, and mobile applications, with a focus on all-in-one test automation.
    • Robot Framework: An open-source, keyword-driven test automation framework for acceptance testing and acceptance test-driven development (ATDD).

    These tools are often integrated into CI/CD pipelines using platforms like Jenkins, TeamCity, or GitLab CI to automate the execution of functional integration tests as part of the build process. They can be combined with version control systems, issue tracking tools, and other test management software to streamline the testing workflow.

  • How do you select the right tool for functional integration testing?

    Selecting the right tool for functional integration testing involves evaluating several factors:

    • Compatibility: Ensure the tool supports the technologies and frameworks used in your application stack.
    • Integration Capabilities: The tool should easily integrate with your CI/CD pipeline and other testing tools.
    • Usability: Look for tools with an intuitive interface and good documentation to minimize the learning curve.
    • Flexibility: Choose a tool that allows you to write tests in a way that suits your team's skills and preferences.
    • Scalability: The tool should be able to handle the complexity and size of your application as it grows.
    • Reporting Features: Detailed and clear reporting is crucial for identifying issues and communicating with the team.
    • Support and Community: A strong community and professional support can be invaluable for troubleshooting and best practices.
    • Cost: Consider both the initial investment and the long-term costs associated with licenses, maintenance, and infrastructure.
    • Performance: The tool should execute tests quickly and efficiently to keep pace with rapid development cycles.
    • Extensibility: Look for tools that allow customizations and extensions to fit specific testing needs.

    Evaluate tools based on these criteria and consider conducting a proof of concept with shortlisted options to see how they perform in your environment. Remember, the best tool is one that aligns with your team's expertise and your project's specific requirements.

  • What role does automation play in functional integration testing?

    Automation plays a crucial role in functional integration testing by:

    • Enhancing efficiency: Automated tests execute repetitive tasks faster than manual testing, allowing for more tests in less time.
    • Improving accuracy: Automation reduces human error, ensuring that integration points are tested consistently.
    • Facilitating regression testing: Automated tests can be rerun easily to ensure that new code changes do not break existing functionality.
    • Enabling continuous testing: Automation integrates with CI/CD pipelines, allowing for tests to be run automatically whenever changes are made.
    • Supporting complex scenarios: Automation can simulate multiple integrated components interacting together, which might be difficult to achieve manually.
    • Providing quick feedback: Automated tests yield immediate results, helping developers to quickly identify and fix issues.

    In functional integration testing, automation ensures that the integrated components work together as expected, verifying that the system behaves correctly and meets the specified requirements. It's a force multiplier, allowing teams to cover more ground with fewer resources, and it's essential for maintaining a high standard of quality in rapidly evolving software projects.

  • How can continuous integration tools aid in functional integration testing?

    Continuous integration (CI) tools streamline the process of functional integration testing by automating the build, deployment, and testing cycle. They enable teams to integrate code changes more frequently, which helps in detecting issues early in the development cycle.

    CI tools can trigger automated functional integration tests upon each code commit or scheduled intervals. This ensures that new code changes do not break existing functionality. By integrating with version control systems, CI tools can pull the latest code, manage dependencies, and set up the necessary test environment.

    Automated test execution provided by CI tools allows for parallel testing, which reduces the time required to run comprehensive test suites. They also provide immediate feedback to developers through reports and dashboards, highlighting failed tests and potential issues.

    CI tools facilitate collaboration by integrating with communication platforms, notifying teams about the test outcomes, and enabling quick response to failures. They support continuous delivery by ensuring that only code that passes functional integration tests is promoted to subsequent stages in the pipeline.

    By leveraging CI tools for functional integration testing, teams can maintain a high level of code quality, reduce manual effort, and accelerate the release process.

    # Example CI pipeline configuration snippet for functional integration testing
    stages:
      - build
      - test
      - deploy
    
    build_job:
      stage: build
      script:
        - echo "Building the application..."
        - build_command
    
    functional_integration_test_job:
      stage: test
      script:
        - echo "Running functional integration tests..."
        - test_command
    
    deploy_job:
      stage: deploy
      script:
        - echo "Deploying to staging environment..."
        - deploy_command
  • What are the latest trends and technologies in functional integration testing?

    The latest trends and technologies in functional integration testing include:

    • AI and Machine Learning: AI-driven test automation tools are becoming more prevalent, using machine learning to optimize test suites, predict the most critical test cases, and identify flaky tests.

    • Shift-Left Testing: Teams are integrating testing earlier in the development process to catch issues sooner, often using Behavior-Driven Development (BDD) frameworks like Cucumber to define tests in natural language.

    • Service Virtualization: To manage dependencies and simulate external services, service virtualization tools like WireMock and Mountebank are used, allowing testing to proceed without waiting for external components.

    • Containerization: Docker and Kubernetes are used to create consistent testing environments, ensuring that tests run in the same conditions every time, which is crucial for microservices architectures.

    • Test Environment Management Tools: Tools like TestEnvironmentManager (TEM) automate the setup, tear down, and management of test environments, reducing manual effort and speeding up the testing cycle.

    • Cloud-Based Testing Platforms: Platforms like BrowserStack and Sauce Labs offer cloud-based environments for testing web and mobile applications across various browsers and operating systems.

    • Performance Testing Integration: Tools like JMeter and Gatling are integrated into the functional testing process to check both functionality and performance under load.

    • Codeless Automation Tools: Tools that allow for creating automated tests without writing code are gaining popularity, enabling non-technical stakeholders to contribute to test automation.

    • Continuous Testing: Integration with CI/CD pipelines using tools like Jenkins, GitLab CI, and GitHub Actions for continuous testing is standard practice, allowing for immediate feedback on the impact of code changes.

Real-world Applications

  • Can you provide examples of functional integration testing in real-world applications?

    Functional integration testing verifies the correct interaction between different modules or services in a system. Here are some real-world examples:

    E-commerce Application: Testing the interaction between the shopping cart module and the payment gateway. This would involve adding items to the cart, proceeding to checkout, and ensuring the payment process works as expected with the correct totals being passed to the payment service.

    Banking Software: Verifying the integration between the account management and transaction processing modules. Tests would include transferring money between accounts and checking that balances update correctly across the system.

    Healthcare System: Testing the integration between patient records and appointment scheduling modules. This would involve creating a new patient record and then scheduling an appointment, ensuring the data flows correctly between the two systems.

    Mobile Application: Ensuring that a social media app correctly integrates with the device's camera and photo gallery modules. Tests would include taking a photo within the app and uploading it to the user's profile.

    IoT Platform: Testing the integration between IoT devices and the data analytics module. This could involve sending sensor data from the devices and verifying that the analytics module processes and displays the data accurately.

    In each case, the focus is on the data flow and interaction between the integrated components, ensuring they work together to perform a specific function within the larger system.

  • How does functional integration testing fit into the Agile methodology?

    In the Agile methodology, functional integration testing is integrated into the iterative development process. Agile teams prioritize collaboration, customer feedback, and small, frequent releases, which aligns well with the objectives of functional integration testing.

    During each sprint or iteration, new features are developed, integrated, and tested. Functional integration testing is conducted to ensure that the new functionality works as expected and integrates seamlessly with existing system components. This approach helps in identifying and resolving integration issues early, which is crucial in Agile's fast-paced environment.

    Agile teams often employ Continuous Integration (CI) practices, where code changes are automatically built, tested, and merged into a shared repository frequently. Functional integration tests are a part of the suite of automated tests that run in the CI pipeline. This ensures that any code changes do not break the existing functionality.

    The focus on automated testing in Agile supports the rapid feedback loop necessary for the iterative development process. By automating functional integration tests, teams can quickly assess the impact of changes, leading to more efficient and reliable software delivery.

    Functional integration testing in Agile is about maintaining software quality at every stage of development, ensuring that all parts of the system work together as expected after each change, and keeping the product in a releasable state at all times.

  • How does functional integration testing contribute to the overall quality of a software product?

    Functional integration testing enhances software quality by ensuring that interacting components work together as expected. It verifies the correctness of interfaces and interactions, catching issues that unit tests might miss. This level of testing helps to identify regressions and side effects early, which are often introduced when new features are integrated or existing features are modified.

    By focusing on the integration points, functional integration testing can pinpoint incompatibilities and data flow problems that could lead to system-wide failures. It also provides a safety net for refactoring efforts, allowing developers to make changes with confidence that the software's functionality remains intact.

    Incorporating functional integration testing into the continuous delivery pipeline ensures that each integration is validated, reducing the risk of defects making it to production. This practice supports high-quality releases and faster delivery by catching and addressing issues as soon as they are introduced.

    Moreover, functional integration testing contributes to a comprehensive test coverage, complementing unit and system testing. It helps to build a robust and reliable software product by focusing on the user's perspective and ensuring that the integrated components deliver the intended functionality in a cohesive manner.

  • What are the consequences of not conducting functional integration testing?

    Not conducting functional integration testing can lead to several adverse outcomes:

    • Undetected Integration Issues: Critical bugs at the interfaces between integrated components may go unnoticed until later stages, causing delays and increased costs.
    • Poor User Experience: Without verifying functional aspects during integration, the software may exhibit erratic behavior, leading to a subpar user experience.
    • Increased Risk of Failures: Skipping this testing phase can result in system failures in production, as untested interactions can cause unpredictable results.
    • Compromised System Reliability: The reliability of the system can be compromised if components do not work together as expected, potentially affecting business operations.
    • Inaccurate Quality Assessment: The overall quality of the software cannot be accurately assessed without functional integration testing, as it provides insights into the system's functional health.
    • Delayed Delivery: Discovering integration defects late in the development cycle can lead to significant delays in the delivery of the software product.
    • Higher Costs: Defects found later in development or after release are often more expensive to fix, increasing the project's cost.
    • Legal and Compliance Issues: For regulated industries, failing to perform adequate testing, including functional integration, can result in non-compliance with legal and industry standards.

    In summary, neglecting functional integration testing can have serious implications for the stability, quality, and reliability of the software, potentially leading to financial loss, damage to reputation, and legal repercussions.

  • How does functional integration testing work in a microservices architecture?

    Functional integration testing in a microservices architecture involves verifying the interactions and data flow between different services to ensure they work together as expected. Given the distributed nature of microservices, this testing focuses on the points of contact between services, such as APIs or message queues.

    Test scenarios are designed to mimic real-world use cases that span multiple services. These scenarios validate that the integrated services meet business requirements and handle data correctly across service boundaries.

    Service stubs or mocks are often used to simulate the behavior of external services that are not part of the test scope, allowing for isolation of the services under test. This is crucial for pinpointing issues and ensuring that tests are not affected by external dependencies.

    Test automation in this context typically involves:

    • API testing tools like Postman or RestAssured for RESTful services.
    • Service virtualization tools to mimic external systems and services.
    • Messaging protocol tools for services that communicate through asynchronous messaging.

    Continuous Integration (CI) pipelines are configured to trigger these tests automatically upon code commits, ensuring immediate feedback on the integration status of the services.

    Observability tools are integrated to monitor the services and provide insights into the system's behavior, which is critical for diagnosing issues that may arise during testing.

    In summary, functional integration testing in microservices ensures that independently developed services work together seamlessly, maintaining system integrity and reliability.

TwitterGitHubLinkedIn
AboutQuestionsDiscord ForumBrowser ExtensionTagsQA Jobs

Rayrun is a community for QA engineers. I am constantly looking for new ways to add value to people learning Playwright and other browser automation frameworks. If you have feedback, email luc@ray.run.