Tag: CS@Worcester

  • Week 18 Post

    This post I will cover integration testing and why we use it today. Integration testing is a critical phase in the software development lifecycle, focusing on the integration of individual components into a cohesive system. It ensures that various modules or subsystems work together as intended. One of the primary challenges in integration testing is ensuring comprehensive coverage of interactions between different components. Identifying the right integration points and scenarios to test can be complex, especially in large-scale projects with numerous dependencies.

    Selecting appropriate test cases to validate integration points is crucial. It requires understanding how components interact and designing tests to simulate these interactions effectively. Failure to cover all integration scenarios may lead to undetected defects, impacting the reliability and functionality of the software.

    Moreover, integration testing often involves testing across different environments and platforms, adding to the complexity. Ensuring compatibility and consistency across various configurations is essential for delivering a robust product. One of the primary hurdles is achieving comprehensive test coverage across all integration points. Prioritizing critical integration points and designing effective test scenarios are essential to address this challenge.

    Another challenge is managing the dependencies and external services during integration testing. Mocking or simulating external dependencies may be necessary to isolate various parts for testing, but it can also introduce its own set of challenges, such as maintaining realistic testing environments.

    Furthermore, integration testing requires coordination among development teams working on different modules or services. Synchronizing changes and ensuring compatibility between components can be challenging, particularly in agile or distributed development environments.

    Frameworks like Selenium are helpful for automating web browser interactions to test integrations between web components. For broader integration testing needs, companies might choose tools like Katalon Studio, which offers a comprehensive suite for web, mobile, desktop, and API testing. Additionally, some companies leverage enterprise-grade solutions like IBM Rational Integration Tester that provide robust features for complex integrations and compliance requirements. Ultimately, the choice of tool depends on the specific needs of the project and the company’s development environment.

    Integration testing verifies the interactions between software modules, ensuring they function seamlessly as a unified system. Unlike unit testing, which examines individual components in isolation, integration testing focuses on how these components integrate and communicate with each other. It plays a crucial role in detecting issues arising from the integration of diverse elements, such as incompatible interfaces or conflicting behaviors. By identifying and addressing these issues early in the development process, integration testing helps prevent costly errors from surfacing in production. It’s step towards delivering reliable, high-quality software that meets user expectations and business requirements.

    Blog Post: https://www.opkey.com/blog/integration-testing-a-comprehensive-guide-with-best-practices and https://www.testlearning.net/en/posts/integration-testing

  • Week 16 Post

    This week’s blog post will cover System Testing and its main benefits. System Testing, as the name suggests, revolves around evaluating the entire system as a whole. It’s not just about scrutinizing individual components; it’s about ensuring that all parts seamlessly integrate and function as intended. This phase of testing comes after the completion of unit and integration testing, aiming to validate the system against its specified requirements. It involves subjecting the system to a barrage of tests to assess its compliance with functional and non-functional requirements. From testing the user interface to examining performance metrics, System Testing leaves no stone unturned in the quest for a robust and reliable software product. This method is most effective before launching your product, to ensure a total coverage.

    Security vulnerabilities can be a project’s nightmare. System Testing acts as a guardian, identifying security loopholes and ensuring the system is robust against potential attacks. One of the key tenets of System Testing is its focus on real-world scenarios. Instead of merely verifying technical functionalities, System Testing endeavors to simulate user interactions and workflows. By replicating typical usage scenarios, testers can unearth potential bottlenecks, usability issues, and even security vulnerabilities lurking within the system. Through testing and analysis, it offers valuable insights into the system’s readiness for deployment. Moreover, System Testing serves as a safeguard against post-release hurdles by preemptively identifying and preventing potential pitfalls.
    System Testing does have its cons however, one crucial step in system testing is creating a comprehensive test plan. This is crucial for effective System Testing because it ensures all bases are covered and avoids blind spots.

    Like most of the testing techniques we have covered in class, tools play a pivotal role in streamlining the testing workflow. From test automation frameworks like Selenium and Cypress to performance testing tools like JMeter and Gatling, there’s a plethora of tools available to expedite the testing process. Leveraging these tools not only enhances efficiency but also empowers testers to uncover hidden defects more effectively.

    System Testing stands as a cornerstone of software quality assurance, offering a panoramic view of the system’s functionality and performance. While it may pose its fair share of challenges, the insights gleaned from System Testing are invaluable in ensuring the delivery of a high-quality, robust software solution. By embracing System Testing, you’re essentially investing in the quality and reliability of your software. It’s the final hurdle before launch, guaranteeing a smooth user experience and a successful project.

    Blog Post: https://blog.qasource.com/what-is-system-testing-an-ultimate-beginners-guide

  • Week 15 Blog

    This week I decided to revisit Behavior-Driven Development, I’ve chosen this topic because, like Pairwise and Combinatorial Testing, understanding BDD prior to engaging in any related activities can significantly enhance your comprehension and application.

    Behavior-Driven Development, or BDD, is a technique that aims to align software development with the expected behavior of the system. It focuses on making sure everyone is on the same page regarding how the software should work. Instead of just writing technical tests, BDD emphasizes describing the system’s behavior in plain language that anyone can understand. BDD promotes test automation by turning scenarios into executable specifications. Automated tests are written to verify that the system behaves as described in the scenarios. Instead of dry lists of requirements, scenarios showcase how users will interact with the app.

    BDD is a collaborative approach that gets everyone speaking the same language. By focusing on how the app should behave, it reduces misunderstandings, catches bugs early on, and keeps your project on track. Additionally, by involving stakeholders in the creation of scenarios, BDD fosters ongoing communication and feedback throughout the development process. This collaborative approach helps build a sense of ownership and accountability among team members, which ultimately leads to better
    outcomes.
    A pro to BDD is the scenarios and examples you create will double as living documentation. This means the documentation stays up-to-date with the evolving app, reflecting the latest features and functionalities.

    Of course, Behavior-Driven Development has its cons, One common challenge is writing effective scenarios that accurately capture the desired behavior of the system. It can be tough to strike the right balance between too much detail, which can lead to fragile tests, and too little detail, which can result in ambiguity. Additionally, BDD requires keeping scenarios up to date as the system evolves. We are constantly coming up with new features for our projects, and scenarios may need to be updated to reflect these changes. Its important to note, BDD is a powerful tool, but it’s not a foolproof solution. There’s still room for miscommunication, so clear communication is key. BDD promotes clear communication, but it doesn’t eliminate the need for it altogether.

    In practice, teams often use tools like Cucumber, SpecFlow, or Behave to implement BDD. These tools provide features for writing and executing scenarios, as well as generating reports to track the status of tests. By using these tools, teams can streamline the BDD process and ensure that scenarios are written and executed efficiently.

    Blog Post: https://semaphoreci.com/community/tutorials/behavior-driven-development

  • Week 13 Blog

    This week’s blog post topic covers Pairwise and Combinatorial Testing. I chose this topic because we will soon cover it in class and having some background information prior to any activities involving this method will be useful to relate back to.

    Pairwise Testing, also known as All-Pairs Testing, focuses on efficiency by testing every possible pair of input parameters, rather than every single combination. For instance, if you have a form with fields for name, email, and phone number, Pairwise Testing would cover combinations like name and email, name and phone number, and email and phone number. It’s a straightforward way to catch potential bugs without an overwhelming number of test cases. With Combinatorial Testing, it builds on Pairwise Testing by considering combinations of three or more parameters together. Using our form example, Combinatorial Testing would include triples like name, email, and phone number. This comprehensive approach aims to uncover bugs that might only appear with specific combinations of inputs. This testing method aims to optimize efficiency and coverage. Software testing can be time-consuming, especially with numerous parameters and scenarios. Pairwise and Combinatorial Testing streamline the process, allowing you to detect more bugs in less time.

    The key benefits to this method is it helps in reducing the number of test cases needed to achieve “good” coverage. Instead of exhaustive testing, you’re strategically covering the most important combinations. Secondly, it helps in identifying interactions between parameters that might lead to unexpected behavior. By testing these combinations, you’re better prepared for real-world usage scenarios.

    Of course, there are disadvantages to Pairwise and Combinatorial Testing. One, It can become tedious due to the large number of test cases required to cover all input combinations. Two, It relies on the interaction of pairs of parameters to determine outcomes, but this assumption may not always hold true, potentially missing bugs. And three, additional tests might be necessary to complement pairwise testing, adding extra time and effort to the testing process.

    The main challenge when using this method is selecting the correct input parameters. The choice of relevant parameters impacts software behavior. Careful selection ensures thorough test coverage and defect detection. However, accurately determining parameter interactions is equally as difficult, because it could potentially result in the selection of incorrect combinations.

    Some of the tools used by teams are PICT, IBM FoCuS, ACTS, Hexawise, Jenny, etc. These tools help automate the test case design process by generating a compact set of parameter value choices as the desired test cases. This is done by applying the all-pairs testing technique, which involves testing all possible combinations of two parameters.

    Blog Post: https://testsigma.com/blog/pairwise-testing/

  • Week 11 Blog

    This week’s blog will cover the main purpose of Object Oriented Testing and its usefulness. You most likely have heard the term “Object Oriented Programming”, which refers to a style of programming that utilizes classes, abstract classes, inheritance, polymorphism, concurrency, and more as a way of organizing code. These tools can be useful when dealing with multiple lines of code because it can be broken down into multiple files creating a more organized and readable product. Having a file with thousands of lines of code is a developers nightmare. Object Oriented Testing aims to test these systems and ensure they are behaving as expected. It is possible to have too much inheritance in a program, making it difficult to find where a piece of code is located, slowing down development. Unlike other test methods that primarily test function behavior, Object Oriented Testing analyzes the behavior of the entire class and its interactions with other files.

    There are multiple techniques to Object Oriented Testing: Unit Testing, Integration Testing, Inheritance Testing, Polymorphism Testing, and Encapsulation Testing just to name a few. Unit testing refers to testing of individual components of the class before testing the interactions it has with other classes. Initially testing the classes functions will prevent scenarios where you can’t locate the bug in the program because there are too many inherited classes. An example is testing each function and ensuring the behavior. Integration testing refers to testing objects of different classes and ensuring they behave properly with all the components. Inheritance testing aims to test the relationship between parent and child classes. This technique of testing also tests overridden functions are properly implemented and are actually overriding the function. Polymorphism testing aims to verify that objects of different types can be used interchangeably. This type of testing ensures the behavior across all types of objects. Encapsulation testing tests access control and ensures the data being accessed is allowed to be accessed by the user.

    The main benefits of running these tests is to detect defects early on rather than later in the development process. For this reason, it’s recommended to run tests throughout development. Object Oriented Testing ensures our project is modular, making it easier to maintain. In addition, it becomes easier to implement new features and classes without impacting existing code. Due to the never-ending demands of modern applications and the ever-evolving tech industry, the scalability of a program is crucial.

    Blogs chosen: https://medium.com/@hamzakhan522001/object-oriented-testing-1f9619da40d0
    and https://www.h2kinfosys.com/blog/object-oriented-testing/

  • Week 8 Blog

    This week’s blog topic was chosen simply because I had zero knowledge of the term/topic. Jake Holy’s blog on Stochastic and Property-Based Testing blog covers the uses of each testing and effective tools used to implement each. Stochastic testing refers to the testing method that uses random inputs to test the behavior of the program. Rather than using predetermined inputs for test cases, stochastic utilizes various inputs to find unexpected bugs in the program. The main purpose of stochastic testing is to uncover errors through unorthodox methods. This method offers a wide testing coverage by testing all possible scenarios that might go unnoticed with traditional testing.

    Property based testing refers to the method of testing by describing what the software should do rather than creating distinct test cases. Initially, testers establish properties that describes what the code should always do. This method of testing utilizes tools that automatically generate test cases to test these properties. After generating these cases, random inputs are utilized to ensure the properties are followed. The benefit of this testing method is testers are only required to declare the properties the code must follow. Instead of manually creating test cases and risking the possibility of missing a test case, these cases are generated for them. Property based testing guarantees effective test coverage. Additionally, this form of testing allows testers to focus on the abstraction and behavior of their code, allowing for a more robust product.

    The blog goes in-depth with various testing tools, for example, a testing library created for the Haskell programming language called QuickCheck, which allows developers to write properties for their code which is automatically generated into test cases. QuickCheck has become a very popular tool to use for testing due to its automation, which is why it has been ported to other programming languages like Python and Scala.

    The second tool that the blog mentions is Stimulant for Clojure. Similar to QuickCheck, Stimulant allows developers to define properties and it automatically generates test cases to test your program.

    One thing that is mentioned in both testing libraries is shrinking. Shrinking refers to the method of finding the smallest input of a failing case, allowing developers to precisely pinpoint areas in the program that is causing the test case to fail. It is crucial that developers know their program has failed a test case, but it is even more crucial that they know why, so they can effectively fix the problem.

    Blog: https://blog.jakubholy.net/2013/06/28/brief-intro-into-randomstochasticprobabilistic-testing/

  • Week 3 Blog

      This week I chose a blog post that covers the difference between black box and white box testing. In general, testing a program is a vital pillar in producing reliable software to customers. Testing helps uncover and mitigate defects in programs. Blackbox testing refers to the testing technique where the tester has zero knowledge of how the internal source code works. This technique involves the tester executing the code and analyzing the behavior and functionality. The reason why this practice is referred to as “black box testing” is because you can’t see in the box, similar to the tester not having access to the code. The benefit of black box testing is anyone can be a tester. Since the tester does not need knowledge of the internal code, there is not limit to who can be a tester. Non-programmers can execute the code and verify the results. A major disadvantage of this testing is the inability to pin point what caused the error. Since the tester has zero access to the internals, the only thing they know is the program doesn’t function as intended.

      White box testing, also referred to as clear box testing, is a testing method that involves having access to the internal workings of the code while testing it. This testing method requires the tester to have prior knowledge about programming to analyze the source code. White box testing focuses on the internal logic, code structure, and execution paths. This method of testing allows testers to pin point where the program failed, unlike black box. White box testing excels in scenarios where the accuracy and function of the program is crucial, because developers can easily debug. The main disadvantage to white box testing is it can be time consuming, since testers have to first understand the code’s intended function and analyze each line.

      This information is very useful to know when we cover and simulate each type of testing method in class. It’s crucial to know the disadvantages and advantages to a testing technique before deciding the most suitable one. For example, if you’re testing the user experience of a website, white box testing wouldn’t be the best option because the user isn’t going to access your websites source code. Black box testing would be the most effective technique because it focuses on the functionality of the website. Both of these testing techniques help developers and organizations deliver software that is reliable, meets user expectations, and complies with industry standards and regulations.

    Blog Post: https://www.bairesdev.com/blog/black-box-vs-white-box-testing/

  • CS443 – Software Quality Assurance & Testing is a course I was very excited to take this semester. The topics that we will learn about will pair nicely with CS497 – Programming Language Design & Implementation as they both involve running test cases. Looking at the syllabus, I noticed that one of the tools we will utilize in the course is GitPod, having no experience with GitPod, I’m eager to experiment with its various features.

  • Week 14 Blog

      This last blog post I decided to revisit an important topic in class: Agile Project Management. This topic initially piqued my interest due to my lack of prior knowledge about how crucial project management can affect the product of a project. The blog post I chose highlights the Agile Manifesto and the twelve key principles to Agile. In addition, the post discusses the benefits of having a project management, for example, structured project management plans remove the fear of making a bad decision when a problem arises. Agile in particular helps improve collaboration and productivity between parties, in turn, producing a better/more refined final product.

      You might ask yourself, “These benefits sound great, but you haven’t told us how to implement Agile”, luckily this blog post dives into various tools that make project management easier. The first tool, Workast, provides features that let you create tasks for the team, set due dates, assign tasks to certain people, and even host meetings through Slack. Similar to lists in GitLab, Workast allows team members to group tasks into lists and move them according to its completion status. This tool is a great way to visualize project progression and productivity. The second tool mentioned is Trello, similarly, Trello allows teams to create to-do tasks and post them on a timeline. Lastly, we have a program called ClickUp which allows users to select a scrum workflow style. Managing sprints, tracking sprint progress, and creating daily scrum boards are just some of the features ClickUp offers.

      One thing that is the most important is having a place to manage your sprints. Having easy access to information like total estimation of the sprint and spillover tasks are crucial to analyzing project progression. After researching the three tools that the blog mentions, I believe ClickUp gears more towards an agile/scrum workflow.

      After reading the blog post, I’m curious to learn about other types of project management techniques and guides. It is no doubt that Agile is an effective approach to optimize project production, however, the Agile methodology does come with its disadvantages: poor long-term planning, dependency on the customer, greater demand on development team. Because the Agile methodology is flexible with its timelines, it’s difficult to predict when a project will be finished. Agile also utilizes feedback from the customer to ensure a product is beneficial to a customer. Team members are expected to meet daily at the same time, putting pressure on developers to stick to one schedule despite a having a duties that are constantly changing.

      Blog Post: https://www.workast.com/blog/guide-to-agile-project-management/

  • Week 14 Blog

    This week’s blog post I decided to research more about linting for non-inclusive language. The medium I selected is a blog post by Michael Bachand, an engineer at Airbnb. “Building an Inclusive Codebase” dives into the techniques engineers at Airbnb are taking to make their work environment more inclusive for everyone. In order to create a more inclusive platform, the development team must also be inclusive. To start, the team has increased the diversity in their teams to accommodate every demographic. Bachand emphasizes that building a diverse team will help empower both Airbnb’s hosts and guests. Inclusivity goes beyond forming a diverse team however.

    The team at Airbnb discovered an issue with non-inclusive language in their codebase. After working with employees affected by these terms, the team presented a proposal to the Chief Technology Officer of Airbnb and got the approval to refactor the code to be more inclusive. Michael Bachand stresses that “acknowledgement and resourcing from the highest levels of management legitimized this effort”. The support from management and the CTO prioritizing the task produced a healthier working culture across all teams.

    Airbnb’s development team broke down this problem into two key parts: preventing the use of this language and eliminating the existing language. One essential tool that was utilized was the woke linter which checked each pole request for non-inclusive terminology and suggested alternative terms to promote belonging. The team now had a proper tool to use, however, they didn’t send the tool to every developer immediately. The team took a unique approach by slowly distributing the tool to expert developers. These developers decided which directories the linter should access and which should be excluded.

    Before our in-class activity on this topic, I never thought about how my sentences might unintentionally offend or upset someone. This topic has opened my eyes to how crucial having a linter tool is. Many of these non-inclusive terms sound offensive without the right context which is why every developer should utilize a linter of sort. Reflecting on the problem addressed by Airbnb, having the support from the CTO is reassuring to know that your work is valued by the company. I believe all companies should strive to create a sense of belonging in their work environment, no matter how big or small. I can confidently say that the information I learned today will stick with me for the rest of my career.

    Blog Post: https://medium.com/airbnb-engineering/building-an-inclusive-codebase-bbaa2315e5b8

Design a site like this with WordPress.com
Get started