OU blog

Personal Blogs

Christopher Douce

TM470 Resources

Visible to anyone in the world
Edited by Christopher Douce, Wednesday 5 November 2025 at 16:42

This post shares some resources that might be useful during the course of your project module. Some of what is presented here may be already familiar to you, having studied earlier modules.

What you will need will, of course, vary depending on your project. You will need to make choices about what you need. In your project report, you also need to say something about why you have chosen what you have chosen. Also, do remember, that what you find might be even more helpful than what is given here.

Diversity, Equality and Inclusion

In the UK, the Equality Act 2010 is an important piece of legislation, which defines a number of protected characteristics.

When it comes to computing projects, the W3C WAI WCAG is an important resource, especially if your software product makes use of web technologies.

Ethics

Software systems affect people and society. Requirements for software systems can come from people and society. Wherever there is people, there is also ethics. Computing professionals must behave in a way that is ethical. To help with the Legal, Social, Ethical and Professional Issues, the following sets of guidelines are considered to be helpful:

Gantt chart tools

As suggested in earlier posts, it is a good idea to create a Gantt chart for your project to create an overview of what you expect will happen and when

It is completely up to you how you create your Gantt chart. You might choose to create one using many of the different spreadsheet templates that are available. Alternatively, you could download a software package, such as Project Libre Desktop which is an alternative to the popular Microsoft Project package.

Another approach would be to use one of the many cloud-based Gantt tools that are available, such as GanttPro. These cloud-based products often offer a trial period, after which you have to pay a monthly fee.

Every tool has its own advantages and disadvantages and will have learning curve if you haven’t used one of these tools before.

Generative AI

GenAI can be considered to be a useful resource, but it must be used with caution. Every student has access to a Microsoft product called CoPilot. If AI is used in the creation of code that is used within a software solution, you must document what prompts have been submitted to which language model. If you use AI as a part of a solution to a wider problem, it is important and necessary to discuss the implications of its use, in terms of risks, ethics and bias.

University level guidance is available through this resource: Generative AI in learning, teaching and assessment at the OU. This provides a link to guidance for students. Guidelines for referencing the use of GenAI can be found, in part, on the CiteThemRight website.

Literature review

The literature review is, as suggested earlier, a summary of all your reading that has contributed to the development and completion of your project. Whatever you mention in your literature review rection should be used or applied in some way.

In addition to some of the skills resources that follow, the following resources may be useful:

An introduction to software development Open Learn Badged Open Course (BOC), which contains a very useful section, Finding and reading academic articles.

Srinivasan Keshav’s article entitled How to read a paper offers some practical guidance about how to read and analyse an academic article.

Project management resources

All the guidance you need to complete your project is presented within the module materials (and within this accompanying guide). There are, of course, other resources in the world that can offer some complementary guidance.

One such resource is the Project Management for IT-Related Projects: 3rd edition, published by the British Computer Society (BCS). You don’t need to buy this text, but you may be able to access parts of it through the OU Library.

Although this text is intended for industry professionals, it may be useful for your project. The guidance about project models reflects some of the advice shared in module materials.

Prototyping tools

There are different approaches to prototyping. One of the simplest and most useful tools is, of course, pencil and paper. It is acceptable to draw prototypes of your software product and share these within your project report. An earlier article, TM470 Considering prototyping offers a bit more guidance about the concept of prototyping.

If you wish to use a tool to help you with your prototyping, the following might be useful:

If you wish to go beyond creating prototypes of user interfaces, you could use other tools to create prototype designs of your software system. One such tool is Visual Paradigm which can be useful with drawing of UML diagrams, and diagrams that describe cloud computing infrastructure. Other cloud-based drawing tools could, of course, be used.

Products such as Balsamiq and Visual Paradigm can be used with an academic licence.

Further academic guidance about prototyping can be found in the following text book:

Sharp, H., Rogers, Y. and Preece, J. (2023) Interaction design : beyond human-computer interaction. 6th edition. Milton: Wiley. 

Which is available through the OU Library

Risk assessment and management

Accompanying the description of the lifecycle model are two useful sections: risk assessment and risk management. Risk assessment concerns with considering what the risks to your project might be. Risk management concerns with approaches to deal with those risks. The risk assessment approach presented in the module is relatively simple. It considers risks in terms of impact and likelihood, which is sufficient for the needs of your project report.

Every project is, however, different in the ways that it need to take account of risk. Some wider issues that might be helpful includes the NIST Cybersecurity Framework. There is also ISO 27001, an international standards which concerns information security. Risks can be managed not just in terms of how technology is used, but also how human processes are applied.

Skills, writing and studying

The following links offer some useful practical guidance about writing and studying:

Within the library pages, the following two pages are particularly helpful:

Do also refer to sections in this guide that refer to the writing of your project report and the appropriate uses of Generative AI.

Software development tools

Your choice of tools will depend, in part, on the characteristics of your project, and what skills you wish to develop. An important tool is the integrated development environment (IDE), which often integrates together a text editor, a debugger, and a way to run your software. IDEs can also be connected with version control software (to keep your software safe) and AI assistants, which help you with your learning. Historically, IDEs used to focus on a single programming language, such as Java or Python. Popular IDEs now work with multiple programming languages.

What follows is a useful summary of some popular IDEs:

Apache Netbeans. Netbeans primarily supports the Java programming language but can be used with other languages through extensions.

Eclipse. Eclipse is an enterprise level ‘cloud native’ IDE that supports a wide variety of languages.

IntelliJ. IntelliJ is a popular commercial IDE that was notable for its usability and functionality. A ‘dev toolkit’ pack is available for students.

Microsoft Visual Studio Code. Visual Studio Code is notably the most popular IDE. It can be used with multiple languages. VS Code is not to be confused with Microsoft Visual Studio, which is a different similarly named product.

PyCharmPyCharm is a Python IDE from JetBrains who also have created IntelliJ. An alternative tool for Python developers is the Jupyter Notebook environment.

Software testing

A thorough project will move through an entire cycle of gathering requirements, implementing those requirements, through to carrying out of testing to make sure that requirements have been implemented correctly.

There are a number of tools that can help with the software testing (which is not to be confused with usability testing).

In terms of source code, there is a unit testing framework which is known as xJunit, where the ‘x’ refer to the initial of a programming language. The xUnit.net site relates to a unit testing framework that can be used with a number of different Microsoft .NET languages. JUnit.org if specifically concerned with unit testing of Java code. There is also PyUnit which concerns the testing of Python code.

Unit testing is testing that operates at a low level. Moving up a level, there are other tools, such as Cucumber. There are other tools out there, such as Selenium, but this takes us beyond the boundaries of a project, and towards testing at an industrial level.

An important point to remember is that the extent of testing that is necessary depends on what the impact of errors might be. Testing is guided by risk.

Version management

It is important to keep the software you create safe. The best way to do this is to use a version management system. The dominant tool used for version management is called Git. Git allows you to save your software into a safe repository called GitHub. The following introductory videos offer some useful explanations:

To begin to use Git, you must install the Git software on your local computer. If you are using Windows, you will install something called a ‘terminal’, MinTTY, which allows you to execute Git commands and upload your code to GitHub. There is also a graphical user interface version, but in terms of gaining practical experience, it is best to use the terminal (unless, of course, you manage to use Git as a part of your IDE).

By way of further information, the following resource is helpful: Ponuthorai, P.K. and Loeliger, J. (2022) Version Control with Git. 3rd edition. O’Reilly Media. Appendix A, History of Git, offers a lot of useful background information, which is worth a read.

Reflections

It is hoped this blog post offers some useful resources to complement what is shared within the module materials. Since your project is intended to be an individual project, I have not covered tools that support collaboration in an agile environment, such as Jira. Similarly, I have not shared resources that concerns covered cloud computing, since there is no need to consider deployment beyond your own personal computer, unless you decided this is an important element of your project.

A key point is that you must choose resources that you feel you need to use and apply within your project. You also should find the time to write about what these are. You should also say something about the skills you need to acquire to use or apply these resources.

A final note: none of the software products mentioned here are official university recommendations; these are personal opinions (which may, or may not, be useful).

Permalink
Share post
Christopher Douce

Software Engineering Radio: Testing

Visible to anyone in the world
Edited by Christopher Douce, Thursday 2 October 2025 at 13:28

The term ‘software testing’ can be associated with a very simple yet essential question: ‘does it do what it supposed to do?’

There is, of course, a clear and obvious link to the topic of requirements, which express what software should do from the perspective of different stakeholders. A complexity lies in the fact that different stakeholders can have requirements that can sometimes conflict with each other.

Ideally it should be possible to trace software requirements all the way through to software code. The extent to which formal traceability is required, and the types of tests you need to carry out will depend on the character of the software that you are building. The tests that you need for a real-time healthcare monitor will be quite different to the tests you need for a consumer website.

Due to the differences in the scale, type and character of software, software testing is a large topic in software engineering. Chapter 5 of SWEBOK v4, the software engineering body of knowledge highlights different levels of test: unit testing, integration testing, system testing, and acceptance testing. It also highlights different types of test: conformance, compliance, installation, alpha and beta, regression, prioritization, non-functional, security, privacy, API, configuration, and usability.

In the article, The Practical Test Pyramid, Ham Vocke describes a simple model: a test pyramid.  At the bottom of the pyramid are unit tests that test code. These unit tests run quickly. At the top, there are user interface tests, which can take time to complete. In the middle there is something called service tests (which can also be known as component tests). Vocke’s article is pretty long, and quickly gets into a lot of technical detail.

What follows are some highlights from some Software Engineering radio episodes that are about testing. A couple of these podcasts mention this test pyramid. Although testing is a broad subject, the podcasts that I’ve chosen emphasise unit testing.

The first podcast concerns the history of unit testing. The last podcast featured in this article offers some thoughts about where the practice of ‘testing’ may be heading. Before sharing some personal reflections, some other types of test are briefly mentioned.

The History of JUnit and the Future of Testing

Returning to the opening question, how do you know your software does what it supposed to do? A simple answer is: you get your software to do things, and then check to see if it has done what you expect. It is this principle that underpins a testing framework called JUnit, which is used with software written using the Java programming language.

The episode SE Radio 167: The History of JUnit and the Future of Testing with Kent Beck begins with a short history of the JUnit framework (3:20). The simple idea of JUnit is that you are able to write tests as code; one bit of code tests another. All tests are run by a test framework which tells you which tests pass and which tests fail. An important reflection by Beck is that when you read a test, it should tell you a story. Beck goes on to say that someone reading a test should understand something important about the software code. Tests are also about communication; “if you have a test and it doesn’t help your understanding … it is probably a useless test”.

Beck is asked to explain the concept of Test Driven Development (TDD) (14:00). He describes it as “a crazy idea that when you want to code, you write a test that fails”. The test only passes when that code that does what the test expects. The podcast discussion suggests that a product might contain thousands of tiny tests, with the implication that there might be as much testing code as production code; the code that implements features and solves problems.

When considering the future of testing (45:20) there was the suggestion that “tests will become as important to programming as the compiler”. This implies that tests give the engineers useful feedback. This may be especially significant during periods of maintenance, when code begins to adapt and change. There was also an expression of the notion that engineers could “design for testability” which means that unit tests have more value.

Although the podcast presents a helpful summary of unit testing, there is an obvious question which needs asking, which is: what unit tests should engineers be creating? One school of thought is that engineers should create tests that cover as much of the software code as possible, also known as code coverage. Chapter 5 of SWEBOK shares a large number of useful test techniques that can help with the creation of tests (5-10).

Since errors can sometimes creep into conditional statement and loops, a well known technique is known as boundary-value analysis. Put more simply, given a problem, such as choosing a number of an item from a menu, does the software do what it supposed to do if the highest number is selected (say, 50)? Also, does it continue to work if the highest number just before a boundary is selected (say, 49)?

Working Effectively with Unit Tests

Another podcast on unit testing is SE Radio 256: Jay Fields on Working Effectively with Unit Tests. Between 30:00 and 33:00, there is an interesting discussion that highlights some of the terms that feature within Vocke’s article. A test that doesn’t cross any boundaries and focus on a single class could be termed a ‘solitary unit test’. This can be contrasted with a ‘sociable unit test’, where tests work together with each other; one test may influence another. Other terms are introduced, such as stubs and mocks, which are again mentioned by Vocke.

Automated Testing with Generative AI

To deliberately mix a metaphor, a glimpse of the (potential) future can be heard within SE Radio 633: Itamar Friedman on Automated Testing with Generative AI. The big (and simple) idea is to have AI helper to have a look at your software and ask it to generate test cases for you. A tool called CoverAgent was mentioned, along with an article entitled Automated Unit Test Improvement using Large Language Models at Meta (2024). A point is: you still need a software engineer to sense check what is created. AI tools will not solve your problems, since these automated code centric tools know nothing of your software requirements and your software engineering priorities.

Since we are beginning to consider artificial intelligence, this leads onto another obvious question, which is: how do we go about testing AI? Also, how do we make sure they do not embody or perpetuate biases or security risks, especially if they are used to help solve software engineering problems.

Different types of testing

The SWEBOK states that “software testing is usually performed at different levels throughout development and maintenance” (p.5-6). The key levels are: unit, integration, system and acceptance.

Unit testing is carried out on individual “subprograms or components” and is “typically, but not always, the person who wrote the code” (p.5-6). Integration testing “verifies the interaction among” system under test components. This is testing where different parts of the system are brought together. This may need different test objectives to be completed. System testing goes even wider and “is usually considered appropriate for assessing non-functional system requirements, such as security, privacy, speed, accuracy, and reliability” (p.5-7). Acceptance testing is all about whether it is accepted by key stakeholders, and relate back to key requirements. In other words, “it is run by or with the end-users to perform those functions and tasks for which the software was built”.

To complete a ‘test level’ a number of test objectives may need to be satisfied or completed. The SWEBOK presents 12 of these. I will have a quick look at two of them: regression tests, and usability testing.

Regression testing is defined as “selective retesting of a SUT to verify that modifications have not caused unintended effects and that the SUT still complies with its specified requirements” (5-8). SUT is, of course, an abbreviation for ‘system under test’. Put another way a regression test check to make sure that any change you have made hasn’t messed anything up. One of the benefits of unit testing frameworks such as JUnit is that it is possible to quickly and easily run a series of unit tests, to carry out a regression test.

Usability testing is defined as “testing the software functions that support user tasks, the documentation that aids users, and the system’s ability to recover from user errors” (5-10), and sits at the top of the test pyramid. User testing should involve real users. In addition to user testing there are, of course, automated tools that help software engineers to make sure that a product deployment works with different brewers and devices.

Reflections

When I worked as a software engineer, I used JUnit to solve a very particular problem. I needed to create a data structure that is known as a circular queue. I wouldn’t need to write it in the same way these days since Java now has more useful libraries. At the time, I needed to make sure that my queue code did what I expected it to. To give me confidence in the code I had created, I wrote a bunch of tests. I enjoyed seeing the tests pass whenever I recompiled my code.

I liked JUnit. I specifically liked the declarative nature of the tests that I created. My code did something, but my tests described what my code did. Creating a test was a bit like writing a specification. I remember applying a variety of techniques. I used boundary-value analysis to look at the status of my queue when it was in different states: when it was nearly full, and when it was full.

Reflecting Beck, I appreciated that my tests also told a story. I also appreciated that these tests might not only be for me, but might be useful for other developers who might have the misfortune of working with my code in the future.

The other aspect of unit testing that I liked was that it proactively added friction to the code. If I started to maintain it, pulling apart function and classes, the tests would begin to break. The tests became statements of ‘what should be’. I didn’t view tests in terms of their code coverage (to make sure that every single bit of software was evaluated) but in terms of simple practical tools that gave alternative expressions of the purpose of my software. In turn, they helped me to move forward.

It is interesting and useful to reflect on the differences between the test pyramid and the SWEBOK test levels. In some respect, the UI testing of the pyramid can be aligned with acceptance testing of the SWEBOK. I do consider the integration and system testing to be helpful.

An important point that I haven’t discussed is the question of when should a software engineer carry out testing? A simple answer is, of course, as soon as practically possible. The longer it takes to identify an issue, the more significant the impact and the greater the economic cost. The ideal of early testing (or early problem detection) is reflected in the term ‘shift-left’ testing, which essentially means ‘try to carry out testing towards the left hand side of your project plan’. Put even more simply: the earlier the better.

Returning to the overriding aim of software testing, testing isn’t just about figuring out whether your software does what it supposed to do. It is also about managing risk. If there are significant societal, environmental, institutional and individual impacts if software doesn’t work, you or your organisation needs to do whatever it can to ensure that everything is as correct and as effective as possible. Another point is that sometimes the weak spot isn’t the code, but in the spaces where people and technology intersects. Testing is socio-technical.

To conclude, it is worth asking a final question. Where is the software testing heading? Some of these podcasts suggest some pointers. In the recently past, we have seen the emergence of automation and the engineering of software development pipelines to facilitate continual deployment or delivery of software. I do expect that artificial intelligence, in one form or another, will influence testing practice, but AI tools can’t know everything about our requirements. There will be testing using artificial intelligence and testing of artificial intelligence. As software reaches into so many different areas of society, there will also be testing for sustainability.

Resources

JUnit is one of many bits of technology that can help to automate software testing. Two other  tools s I have heard of are called Cucumber which implements a language called Gherkin, a formal but human-readable language which is used to describe test cases. I’m also aware of something called Selenium which is “a suite of tools for automating web browsers”.

Since software testing is such an important specialism within software engineering, there are a series of industrial certifications that have been created by the International Software Testing Qualifications Board (ISTQB). As well as offering foundation level certifications, there are also certifications for specialisms such as agile, security and usability. Many of the topics mentioned in the certifications are also mentioned in Chapter 5 of SWEBOK v4.

I was alerted to a site called the Ministry of Testing which shares details of UK conferences and events about testing and software quality.

One of the points that I picked up from the podcasts was the point that, when working at forefront of an engineering subject, there is a lot of sharing that takes place through blogs. A name that was mentioned was Dan North who has written two articles that resonate: We need to talk about testing (or how programmers and testers can work together for a happy and fulfilling life), and Introducing BDD (BDD being an abbreviation for Behaviour Driven Development).

Acknowledgements

Many thanks to Josh King, a fellow TM354 tutor, who was kind enough to share some useful resources about testing.

Permalink Add your comment
Share post

This blog might contain posts that are only visible to logged-in users, or where only logged-in users can comment. If you have an account on the system, please log in for full access.

Total visits to this blog: 3221319