Category Archives: CS@Worcester

Sprint 2 Retrospective

Configured proxy to handle requests from HTTPS frontend to HTTP backend

Added new date field dropdown and reformatted date

Still working on transitioning from wsuID to UUID

In sprint 2, as a team we worked well with making progress on our large tasks like modifying endpoints to handle tokens and transitioning from wsuID to UUID. Additionally, we looked to eachother for help when we were stuck and didn’t know how to progress further, preventing teammates from falling behind in their tasks. What didn’t work well occurred due to lack of communication, since both of these tasks depended on Section 1 Team 1 working on the login and keycloak token, it created a standstill since the team didn’t know what how the keycloak token was going to be generated and how the roles were going to work. This problem could have been solved by meeting with team 1 and discussing in person of how we can collaborate and help each. Nonetheless, we were able to design our task around stub functions and once team 1 is done with their task, we can substitute it with their changes.

Another improvement for the team that will be implemented in sprint 3 is better code review. We later noticed that some things in regarding the date field was missing, causing problems with the frontend communicating with the backend. More specifically, the frontend was sending back a json file that didn’t match with what the backend was expecting. This caused problems for other teams because they couldn’t run the guestinfosystem.

To improve as an individual, I would like to get better at managing a team. As of now, I see our team and in it we have subsections of people who usually collaborate together. Going forward I want to get more people involved in discussion and overall progress reporting.

One pattern from Apprenticeship Patterns, that aligns with this sprint is “Reflect As You Work”. This pattern emphasizes the importance of regularly stepping back to evaluate your own progress and learning as a developer. Instead of just grinding through code or tasks, it encourages you to actively think about what you’re doing, why you’re doing it, and how you could improve. This kind of reflection helps identify strengths to build on and weaknesses to address, turning everyday work into a learning opportunity. In this sprint, I spent a lot of time reflecting on not only how I was performing, but how the team was performing. Being a scrum master for the first time, I felt it was my responsibility to ensure everyone felt confident taking on their task. I made a conscious effort to check in with each team member during our meetings and encouraged honest feedback for improvement. By reflecting on the team dynamics, I was able to adjust where I needed to spend more time coding and where I needed to offer support. “Reflect As You Work” became a principle that helped me adapt into the role of scrum master, despite being my first time

From the blog CS@Worcester – Computer Science Through a Senior by Winston Luu and used with permission of the author. All other rights reserved by the author.

Sprint 2 Retrospective Blog Post

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based/backend/-/commit/c8faf74ca26ca4a71df0fb5fa09a428c0c473172
[fix: server persistence issue resolved] – The entrypoint that connected the server and the backend image terminated before the server could build itself.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based/backend/-/commit/162e710813fe4efd59ee9dfdf6d8bd387eabd864
[Merge branch ‘API’ into ‘main’] – Packaged my work on the API (endpoints, openapi.yaml, javascript classes, and database methods) and combined it with the main branch.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based/backend/-/commit/03ca867390a3541020e52b5bce95102002890fda
[chore: updated README.md] – Embedded hyperlink to reference repository and filled in some of the project details.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based/backend/-/commit/ddbc5ae04b174ec3d2bcf981b888726345c6d410
[fix(data):”data folder rename to inventory-data”] – The .gitignore was set to not track any folder titled data, the inventory.js object was in a folder called ‘data’ and as such I changed the folder name.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based/backend/-/commit/514777ff2ff6cd531bee0b480c3d946d7b6cba13
[Merge branch ‘inventory.js’ into ‘main’] – While the server would build correctly, the API was not pathing correctly and any calls would result in 500 errors, skipping the executing body of the endpoints and this was my fix.

Throughout this sprint our team as a whole was rather productive. We planned out some targets for the weeks and were constantly asking questions to the professor so that we understood the goalposts we could set for ourselves. I believe we learned a lot, I myself certainly learned a lot. For instance, in order for the frontend of our project ( https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-category-based ) to use the backend I worked on we needed an image to be pulled from gitlab. The trick was that in order for gitlab to make the image of our backend it needed to pass the project’s pipeline, which we had not even begun to look at and turned out to be extremely labor-intensive. But we asked the professor when we had confusion which would generally set us back on the path and sometimes we just asked general questions on stuff we had not yet touched on so that we could tackle another piece of the project at a later date.

We were not always able to make it to meetings. At the beginning of this project we had made agreements to make it to all the class meetings and last sprint we added a Saturday call that begun at one. I know that I missed one of the Saturday meetings due to being sick but as a group I cannot recall a day where we all were in the call and that does sort of stick with me since at least once members of the group verbalized that they would be there and then not show up. In my opinion, it is crummy to be putting in the effort to have this meeting that everyone in the group agrees is the correct thing to do yet there are group members that are not participating just about every week.

I think a contract needs to be made, not a legally binding one mind you, that has input from every member of the team and is signed by every member of the team. To be clear, this is not something where it is forced upon each person to sign. If any one has an issue with a part that someone else offered then as a group we should come together and compromise on the issue so that everyone agrees to the provision. This is just a way I thought of to put a little more concrete understanding into the team dynamics.

As an individual I have not held up to my end of the agreement I made with the team. I said I would put forward updates to the group every week so that everyone understood my progress in my work and I utterly failed to follow through. I will simply have to keep this promise in mind for this next sprint.

Pattern : Use the Source
Summary : Seek out other people’s code and read it.
Reason for selection : Throughout this sprint I had Thea’s Pantry GuestInfo Backend open in my browser and I was constantly referring to it whenever I was confused about my codes errors.
How it would have changed me : In this case reading up on this pattern would not have changed my approach and in fact this is the reason I picked this pattern. I was already following through on this Apprenticeship pattern and reading it allowed me to put my methodology for this last sprint into words.

From the blog Coder's First Steps by amoulton2 and used with permission of the author. All other rights reserved by the author.

Sprint Retrospective 2

Throughout the second sprint, we had a great basis to launch from for our project. We made great strides throughout the sprint and diagnosed some important issues barring our progress. Our second sprint was far more difficult than our first, but we remained determined as a team and hit some major goals. I thought we communicated in this sprint far better than before, and overall worked well on major progress blockers. The most important of these issues was an issue connecting the back and front ends and managing certificates for our server. We set fair and manageable goals despite these major issues, which were started or met by all members of the team. We were again very transparent in our communication, and our communication was frequent and on-topic. I spent my time doing three major tasks; setting up persistent data storage for our back-end, researching certificates and helping to set up SSL for the server, and troubleshooting our failing back-end at the end of the sprint.

What I thought didn’t work well in the sprint was the complexity of our issues. While I thought we set manageable and fair goals, they were complex and large. Many goals had to be reworked throughout the sprint, and were met in some capacity. Many issues got pushed to Sprint 3 due to issues we could not solve ourselves. This was a learning moment for me in particular. I would have liked to resolve all our issues on our own, but sometimes outside expertise or another team is needed to resolve an issue. Even if in our case that other team is the IT department, or Professor Wurst. 

As a team I would say that we could better work independently once again. I felt that despite our fair communication, most team work classes resulted in everyone sharing issues. This is something I wanted to avoid, but it happened nonetheless. I would prefer that we work at most in pairs on individual issues, so that major issues do not get sidelined. I felt that my previous retrospective on Sprint 1 should have been vocalized. This is where I think I could improve directly as an individual. I should be more honest in my communication and bring up this flaw sooner, rather than wait for it to improve. Going into Sprint 3 I will be more open and clear about any flaws or issues I see for us all to improve together.

The apprenticeship pattern that best describes my work in this sprint is Retreat into Competence. This fit because the work done throughout the server this Sprint was charting new ground in complex errors. The groundwork we set up in Sprint 1 helped us get our foot in the door, but our SSL certificate issues and back-end connection issues became major roadblocks. I managed these roadblocks by frequently retreating to what I had learned so far, and it allowed me to chip away at the issues and diagnose what to apply to the server.

My tasks:
https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/13
This was my first successful task in the sprint. I successfully connected our back-end to a local filesystem in our server and cleaned all our directories of unnecessary files. I tested persistent storage, and it works fluidly.
https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/18 

Most of my sprint was again spent working on the issue of SSL certificates for our server. I continued to research self-signed certificates until I decided that the best course of action would be to seek out Professor Wurst for a domain. I also worked out that there were unresolved DNS issues in the certificate that were brought to IT. Since this point we have had no SSL issues, and I have updated back-end URLs to accept https.
https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/25
Here I made small progress testing the back-end’s failure before we rolled over to Sprint 3. This is an ongoing issue for Sprint 3 as of this retrospective. During Sprint 2 I made progress in diagnosing the issue of RabbitMQ’s failure, and tested various methods to attempt to resolve it and prevent the back-end from crashing.

From the blog CS@Worcester – WSU CS Blog: Ben Gelineau by Ben Gelineau and used with permission of the author. All other rights reserved by the author.

Sprint 2 – Improving!

If there’s one thing I can say happily about this sprint, its that it went seriously better then the last one!

Lately, I’ve been focused on setting up a universal design for many of the applications that are being worked on throughout all of the groups in this class. Examples of which are show below, as well as a link to the specific GitLab issue they’re tied to.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/gitlab-profile/-/issues/20

The first two shown are my initial generalized mock-ups, showing a generalized feel and theme while also showing off some elements like buttons and subtitles that would be commonplace. The last two are the two latest I’ve made, specifically for the user information group, implementing many of the design critiques that other groups and the professor have given me from the initial design.

For me, I found being able to work in an environment I’m comfortable with, that being visual design, helped a ton with my comfort and goal-setting within this sprint. I felt like I was put on-track compared to last sprint, and was able to do significant work. However, that being said, I felt like I was significantly independent and on my own for a majority of it. None of my team members were doing the same as I, and the work I was doing was specifically for the entirety of the class, not just them. So it felt like there was a bit of disconnect there, and could be fixed for next sprint.

I feel as though I did a lot better than I did last sprint, I was a lot more enthusiastic then before, but I do feel I could have communicated a bit better with my team about my new path in this sprint. I felt I left them behind a little bit, especially Jaylon, who was alone in the Frontend development. Next Sprint, I plan on improving on this by trying to split the visual design aspect of my work evenly with work for my team in specific. As for our team, I cannot really comment too much about what we could change as a group, as I feel they’ve been doing fine, I’m just the weakest link they have at the moment.

For a single pattern, I chose Your First Language as found in Chapter 2, which states that you only understand one or two programming languages, but not the ones particularly known for the job at hand. I chose this one as I felt like understanding a lot of the languages being used in our repositories are something I have minimal understanding in, and need to learn better to help my group as best I can. It suggests I toy around with new languages whenever I can, to best help and learn the ones needed. I feel as though this is something I would have already done, given my lack of time to do so, as I find myself having to juggle with work from this course with my others. However, that does not mean I’m willing to give it a shot going forwards.

All in all, I feel like this sprint was a success, and am looking forwards to the next one, which will be our last sprint. Here’s to improving where I can in that one as well!

From the blog CS@Worcester – You're Telling Me A Shrimp Wrote This Code?! by tempurashrimple and used with permission of the author. All other rights reserved by the author.

Sprint 2 Retrospective

Hi Debug Ducker here, and wow Sprint 2 came and went really fast. I have a lot to share today as well as realizations about myself and the project. Then afterwards I can say one last goodbye and sprint 3 ends, which is coming sooner than I think.

Now what I been working on these past few months was an inventory culling system that will tell the user whether or not food is past their expiration date by USDA standards. The progress on it as of now it more or less complete. It feels strange to say but we are pretty much at the finish line. This was felt after Sprint 1 were the path forward was decided and could be completed in due time. Which left the group working on the backend to not have a lot to do. Because the solution just needed time and everything would be fine.

After that we were pretty much done and I realize that some task can realistically be completed by two or less people. In a way I felt I wasn’t pulling my own weight. Perhaps I should have tried to be more involved with the process than I was and that could of made me feel that I was doing more. I guess that is the result of some projects that the seemingly big task was rather simple so now you just feel, rather empty about the whole thing.

Fortunately, I was given the task of filling out documentation, which is really important as what if the new people that work in this project need a guide. I and with some direction would be the one to write it all out. Documentation is a lot more important than people give credit, a place that can give you all the details about a project is rather handy when you are working on said project. Which I had something similar when I first started. Now I am working on clean up with another partner of mine, and we may be able to get that done soon too.

Last time I reference the book, “Apprenticeship Patterns”, by Dave Hoover and Adewale Oshineye and there is a pattern that reminds me of this situation. The pattern was emptying the cup similar to accurate self-assessment, the idea here is that if you don’t allow yourself to be willing to learn or do more then you aren’t going to do better. I feel I should have pushed myself to at least see what else could have been done with the project, instead of feeling useless.

Here is my work on the Documentation, I mostly did the readme and fixed up the instructions

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-culling/documentation

Here is the Backend work so far in collaboration with other group members. The result was full integration with the scanner side of the project which is almost done

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-culling/inventorybackend

Here is the Scanner portion done by the team focus on it

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-culling/addbarcodefrontend

Thank you for your time and have a nice day

From the blog CS@Worcester – Debug Duck by debugducker and used with permission of the author. All other rights reserved by the author.

Sprint 2 Blog Post

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-weight-based/inventorybackend/-/merge_requests/64
                  Create a local instance of the database in order to have it perpetuate along runs of the backend during development.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem-weight-based/inventorybackend/-/merge_requests/63

                  Create validation in order to avoid negative quantity in inventory.

I also worked directly with one peer to help him resolve some merge conflicts with him Nodemon Implementation issue.

During Sprint 2, I went through some difficulty in getting work done in the correct way. What I mean by this is that I would produce some output to the system without first thinking about how that would affect certain areas, like not considering the physical limits of the system. This led to one of my merge requests this Sprint. The merge request to avoid negative values in the inventory was purely created because I was developing without thinking first. This led me to develop a sense of thinking first and developing second. This helped a lot more during Sprint 2, as I would have a complete and definite idea of what to code even before I sat down and typed it.

What I think did not work so well for me this past Sprint, and I believe was the reason why I produced much less than the first one, was the lack of a due date to deliver something. I have realized during this past month that, in order for me to produce anything myself, I need a due date. If I do not have any due date set to deliver something, I will most likely procrastinate. This is not related to the amount of work I had to do or the length of the Sprint at all. This is something personal, where I should have set due dates for myself in order to produce more and better. This correlates to something I spoke about in my Sprint Blog Post for Sprint 1—the enthusiasm and anxiety of delivering work. This is something that I need to get balanced out, with the use of due dates and time management.

As a team, we entered a really nice spot where we all became close, so working with each other is not an issue at all. During some classes, I would even be worried myself, because sometimes we would be the only group to laugh or have some kind of friendly conversation. Which is great, but we need to be careful that it doesn’t undermine our work. This is also something that I believe could be what is not working so well. Even though this does not happen all the time, some days the chit-chat has slowed us down.

The pattern I chose is called Retreat into Competence. It shows us that sometimes, when we find ourselves with no idea where to go, or find ourselves behind everybody else, or simply lost, we should take a step back, go back to what we know and are comfortable with, and finally launch ourselves forward just like a catapult. Sometimes, in order to take three steps forward, you need to take one back.

Retreat into Competence became a sequence to what I wrote about in the first Sprint. I dove deep, so deep that sometimes I found myself somewhere where I had no idea where to go or how to proceed. I would feel behind compared to my peers. And even without knowing this pattern, it correlates to something I learned from my first programming professor: sometimes all you have to do is retreat, leave the code aside, or go do something else related to it. And honestly, as magical as it may sound, the solution will just come to you. Brainstorming can sometimes happen in a quiet place. If I had read this pattern before, I would have applied it more often. Sometimes, even though I was familiar with such practice, I would still find myself lost.

From the blog CS@Worcester – CS Today by Guilherme Salazar Almeida Nazareth and used with permission of the author. All other rights reserved by the author.

Code Reviews

Source: https://about.gitlab.com/topics/version-control/what-is-code-review/

A code review is code that is peer-reviewed, which helps developers validate the code’s quality before it is merged and shipped to production. Code reviews are done to identify bugs, increase the overall quality of the code, and to ensure that the developers of the product understand the source code. Code reviews allow for a “second opinion” on the functionality of code before it is actually implemented in the systems. This prevents non-functional code from being implemented in the product and potentially causing issues or bottlenecks in performance. Ensuring that code is always being reviewed before merging encourages the developers to think more critically of their own code, and allows reviewers to gain more domain knowledge regarding the systems of the product. Code reviews prevent unstable code from being used by customers, which would lead to poor credibility and overall act as a detriment on the business. The benefits of code reviews are as follows: knowledge is shared among developers, bugs are discovered earlier, establishment of a shared development style/environment, enhanced security, increased collaboration, and most importantly, improved code quality. As with everything, there still are disadvantages. Code reviews lead to longer shipping times, pull focus/manpower from other aspects of the process,and large code reviewers equal longer review times. But the benefits far outweigh these disadvantages.

Code reviews can be implemented in multiple ways, through pair programming, over-the-shoulder reviews, tool-assisted reviews, or even email pass-around. Gitlab offers an interesting feature where developers can require approval from reviewers before their code can be merged. I chose this article because I use this feature frequently in my capstone class. My teammates and I review each other’s changes in the codebase through this Gitlab feature and, if needed, go over these changes in class whether it be through pair programming or over-the-shoulder reviews.

From the blog CS@Worcester – Shawn In Tech by Shawn Budzinski and used with permission of the author. All other rights reserved by the author.

CS443: A Wishlist for Automation and Productivity

You ever think about how being a software engineer is kind of like working in a factory?

Mill & Main in Maynard, where I did a summer fellowship a few years ago. Fun fact: this building and the rest of the town feature prominently in Knives Out (2019). True story!

I mean that quite literally. Especially here in Massachusetts, where primo office space quite frequently gets hollowed out of old textile mills. (The old David Clark building by the intermodal port, and a slew of defense contractors in Cambridge-Braintree, my old workplace included, come to mind.)

In some ways, the comparison isn’t unmerited. I don’t think it’s far-fetched to say that the focus of industry is to deliver product.

Okay, but how?

Last week, I wrote about the failure of the Spotify model — specifically, their implementation of large-scale Agile-based DevOps. You can read more about that here.

The impetus for this week’s blog is ‘what-if’; if, instead of Spotify’s focus on large-scale Agile integration, we approached DevOps (in a general sense) from the bottom-up, with a clear emphasis on software tools and freeform, ad-hoc team structure. What can we use, what can we do to effect a stable and logical working environment?

Just one quick disclaimer: this is bound to be biased, especially in terms of what I’ve seen work in industry. Small, tight-knit teams and relatively flat hierarchies. This won’t work for every situation or circumstance — and by sidestepping the issue of Agile at scale, I feel like I’m ignoring the issues endemic to Spotify’s structure.

Still, I figure it’s worth a shot.

Issue Hub: Atlassian Jira

The first thing we’ll need is an issue tracker. Atlassian doesn’t do a very good job at marketing its products to the non-corporate world, but it’s very likely that almost everyone reading this post has used an Atlassian product at some point or another: Trello, Bitbucket, and, best of them all, Jira. Think of it as a team whiteboard, where we can report on bugs, update our wikis, and view the overall health of our build, all within one web server.

Version Control: Subversion

Subversion is going to be our version control software. Although this doesn’t have all of the downstream merging capability of Git, its centralized nature actually works to our benefit; the specific combination of Jenkins, Jira, and SVN form a tightly-knit build ecosystem, as we will see.

CI Automation: Jenkins

Jenkins is a continuous integration (CI) and build automation utility which will run health checks on downstream builds before they’re committed to the nightly build, and then to the master build overnight. We’ll implement all of our tests and sanity checks within it, to ensure that no one pushes bad code. If, by some miracle, something does get through, we can revert those changes—another handy feature.

How does this work?

SVN repo → Jenkins (throughout-day staging, then end-of-day nightly build, then overnight master) → Jira (for reports and long-term progress tracking).

Does this all work?

In a word, hopefully. The social contract between you and a team of four or five people is much simpler to fulfill than that of you and the Tribe in the Spotify model. (You only have to track the work of several people, as opposed to almost everyone on-campus with the Tribal model).

There are commitments and onboarding requirements to a system like this, too, as there was with the Tribal model, but they’re not as pronounced, especially since we aren’t scaling our structure beyond this one team.

I think what is especially true of the workplace is that no two teams are alike, and it’s kind of crazy to assume that they are, which is exactly what Spotify did. How is it worthwhile to tell people who they should be working with, instead of letting them figure that out on their own?

Rather, by placing constraints on how the work is done (which is what we’re doing here—the emphasis on software as opposed to structure) we can get better results by letting people figure out how to get from Point A to Point B, assuming we properly define both A and B.

Between last week and now: a lot of thoughts to digest.

Kevin N.

From the blog CS-443 – Kevin D. Nguyen by Kevin Nguyen and used with permission of the author. All other rights reserved by the author.

What I Learned About QA: A Computer Science Student’s Take on Real-World Testing Practices

I recently read the article “Streamlining the QA Process: Best Practices for Software Quality Assurance Testing” published by KMS Technology. As a college student studying computer science and still learning the ins and outs of software testing, I found this article especially helpful. It gave me a clearer understanding of what quality assurance (QA) really looks like in real-world software projects.

I chose this article because I’ve been trying to get a better grasp on how testing fits into the bigger picture of software development. A lot of what we learn in class focuses on writing code, but not always on making sure that code actually works the way it’s supposed to. This article breaks down what can go wrong in the testing process and how to avoid those issues, which is something I know I’ll need as I continue learning and working on team projects.

The article talks about a few key challenges that QA teams run into:

Unclear Requirements – This one really stood out to me. The article explains that if the project requirements aren’t clearly defined, testing becomes almost impossible. How can you verify if something works if you’re not even sure what it’s supposed to do? It made me realize how important it is to ask questions early on and make sure everyone’s on the same page before writing code.

Lack of Communication – The article also highlights how communication gaps can mess up testing. If developers and testers aren’t talking regularly, bugs can slip through the cracks. As someone who’s worked on class group projects where communication wasn’t great, I totally see how this could happen on a larger scale.

Skipping or Rushing Testing – The article warns against rushing through testing or treating it like an afterthought. I’ve definitely been guilty of this in my own assignments—leaving testing until the last minute, which usually results in missing bugs. The article suggests integrating testing throughout development, not just at the end, and that’s something I want to start practicing more.

Reading this article made me reflect on my own experience so far. In one of my programming classes, our final project had a vague prompt and my group didn’t ask enough questions. We ended up spending extra time rewriting parts of our code because the requirements kept changing. After reading this article, I see how important it is to define everything early and communicate often.

I also plan to be more intentional about testing as I continue to build projects. Instead of waiting until the code is “done,” I want to get into the habit of testing as I go and making sure I understand the expected behavior before writing a single line.

Overall, this article helped me understand why QA is such a critical part of software development—not just something to tack on at the end. If you’re also a student learning about testing, I recommend giving it a read: Streamlining the QA Process: Best Practices for Software Quality Assurance Testing.

From the blog CS@Worcester – Zacharys Computer Science Blog by Zachary Kimball and used with permission of the author. All other rights reserved by the author.

JUnit Testing

Hello everyone,

For this week’s blog topic I will talk about JUnit, what it is, the importance of it, why it is used, the features that it offers and many more. First to start everything, what is even JUnit. So JUnit is an open source testing framework for Java and it allows programmers to write and then run automated tests. It is very useful to catch bugs early in the development when they are the least expensive to fix. Some of the key features that JUnit has to offer are its powerful testing abilities. It has easy and simple annotation, making writing down the tests even easier. It is intuitive and with just a few practices anyone can get the hang of it. Similar to the Happy Path Tests learnt with behavioral testing, JUnit encourages those normal operations first to be tested. It also supports negative cases and also boundary tests. The blog that I read was really useful as not only it explained what JUnit is but also recommended some good practices for new programmers. For example they advised to test one behavior at a time. This is important as you wanna test a single aspect of the code then move into the other parts of it. You should also use descriptive test names. This is helpful as a clear name can explain directly what you are trying to test for, eliminating confusion and possibly the chance of writing the same test twice. Another good advice given from the author of the blog is that you need to write tests which are independent. This means that different tests should not depend on each other’s results in order for them to run correctly. Lastly, you should always try to test the edge cases. Testing the boundary conditions of the code and also unexpected inputs. Your project should be ready for anything to handle even if an input does not make sense, it should be able to handle correctly and guide the user in the right path. The blog also gives a detailed tutorial on how to not only install JUnit, giving step by step instructions with examples included but also teaches us how to perform automated testing and even in the cloud. At the end of the blog it even offers a FAQ section, clearing any bit of confusion that readers might have. This is a great blog that I recommend everyone to read. It is useful for all ranges of programmers, from beginners to more experienced ones.

In conclusion JUnit Testing is a fundamental skill to learn if you wanna become a great Java Developer. It helps you verify how your code behaves, helps you catch and fix any bugs that might come up at any time of the project development time. Mastering JUnit will not only improve your code quality but also it will give you a boost of confidence when you make any changes, knowing that JUnit will be there for you to catch any bugs. 

Source:
https://testgrid.io/blog/junit-testing/

From the blog Elio's Blog by Elio Ngjelo and used with permission of the author. All other rights reserved by the author.